读取txt文件创建邻接矩阵
txt文本内容如下,要求使用这些数据来生成一个邻接矩阵
0,2,4,22,65536,65536 2,0,1,6,65536,65536 4,1,0,1,4,65536 22,6,1,0,10,5 65536,65536,4,10,0,3 65536,65536,65536,5,3,0
我的苦恼在于不知道如何格式化读取每一行的数据,对C语言读文件操作陌生
复习C语言文件读写C 文件读写 | 菜鸟教程 (runoob.com)
本次重点使用的是fgets()函数
因为它满足我读取每一行的要求,只要判断读取的内容是否为空,写一个循环,fgets()就能实现读取每一行的数据
有了数据后,就需要对数据进行处理。
以第一行为例,数据是以字符串类型存储的,而我想要的邻接矩阵必然是需要int类型,所以就必须将字符串分解
0,2,4,22,65536,65536
如何对一个字符串进行格式化的分解呢?
<string.h>里有strtok()函数C 库函数 – strtok() | 菜鸟教程 (runoob.com)
它可以根据分隔符,将字符串分解为我想要的格式,比如strtok(str,","),按","分割字符串,并返回被分解的第一个子字符串,这里就是‘0’
如果希望得到后续的值,可以再次调用(strtok(NULL, ",")),为什么是NULL呢,这表示默认使用上一次未分割完的字符串继续分割
循环使用strtok(),我就能够得到第一行的数据
因此,可以给出以下思路流程
- 参数初始化,包括邻接矩阵的初始化,文件指针等
- 打开文件
- 循环使用fgets()读取每一行数据
- 循环使用strtok()函数,获取每一列的数据
- 每一行结束后,将本行数据复制到邻接矩阵中
- 关闭文件
附上代码
void main() { FILE *fp; // 文件指针 fp = fopen(path, "r"); if (fp == NULL) { printf("Failed to open file."); return 1; } int graph[MaxVertexNum][MaxVertexNum]; // 邻接矩阵 memset(graph, 0, sizeof(graph)); // 初始化为0 int num_nodes = 0; char line[1024]; int row[MaxVertexNum]; int col = 0; int debug = ; if(debug) { while (fgets(line, sizeof(line), fp)) { char *p = strtok(line, ","); while (p) { row[col] = atoi(p); // 转换为整数并存储到邻接矩阵中 col++; p = strtok(NULL, ","); } memcpy(graph[num_nodes], row, sizeof(row)); // 将本行存储到邻接矩阵中 num_nodes++; col = 0; } fclose(fp); printf("Adjacency matrix:\n"); for (int i = 0; i < num_nodes; i++) { for (int j = 0; j < num_nodes; j++) { printf("%d ", graph[i][j]); } printf("\n"); } } return 0; }