我用C
语言编码。
我在名为graph_input.txt
的文件中存储了以下图表:
7
2 4
1 3 4 6
2 6
1 2 6 5
4
4 2 3 7
6
,其中第一行表示图中顶点的数量,连续的直线表示与顶点1、2、…相邻的顶点。,即顶点1与顶点2和顶点4相邻,以此类推。
我想读取文件并使用链表数组制作邻接表。但是我不知道如何检测一条线的末端,这样我就可以为每个顶点分离出链表。我对c中的文件处理有一点了解,我只知道一些基本的文件操作和函数,这些都是我从网上不同的网站上读到的。最初,我尝试使用getw()
函数一个接一个地读取整数,但getw()
给出的输出是一些奇怪的大数,而不是给定文件中的整数。然后我使用fscanf
逐个读取整数,但现在我无法区分换行符和整数。
我的计划是读取第一行并将数字存储在表示顶点总数的变量中。然后我将声明一个类型为Node
的数组,这是我事先定义的结构。然后,对于数组的每个元素,我将创建一个节点链表,存储与该数组索引相邻的顶点。但为此,我需要能够识别从文件graph_input.txt中读取的每行末尾的换行符,以便从nextline中存储下一个数组索引中的顶点。
请指导我这样做,如果需要,请建议我对我的方案进行任何改进。
根据许多注释,您可以使用fgets
然后解析结果。如果您不想冒因一行长度超过预定义的最大长度而拒绝文件的风险,只需切换到getline
。
另一个解决方案是利用fscanf
有限的解析功能,读取整数,然后跳过空格(您可以添加t
或其他任何内容),最后尝试读取n
。如果您成功地读取了n
,则该行结束。
仍然可以通过检查fscanf
返回码来区分解析结束的原因。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f = fopen("graph_input.txt", "r");
if (f == NULL) {
exit(EXIT_FAILURE);
}
int nver;
if (fscanf(f, "%d", &nver) == 1) {
for (int i = 0; i < nver; ++i) {
// Read a list of vertices and dump it on stdout with commas
int res;
do {
int idx;
res = fscanf(f, "%d%*[ ]", &idx);
if (res != 1) {
break;
}
printf("%d, ", idx);
char newline[2];
res = fscanf(f, "%[n]", newline);
} while (res == 0);
if (res == -1) {
printf("EOF foundn");
break;
}
if (res == 0) {
printf(" failed to read integer valuen");
break;
}
if (res == 1) {
printf("newline foundn");
}
}
}
fclose(f);
exit(EXIT_SUCCESS);
}