我有一个这样的文件:
1 100
2 200
3 300
4 400
1
我想将其保存为矩阵,如果没有第二个数字我想保存NULL!
我试着编写程序,但它无法正常工作!
#include<stdio.h>
int main() {
int k=0 ,i,j , arr[100][100];
FILE *in= fopen("file.txt","r");
char line[1000];
while(fgets(line,1000,in) !=NULL) k++;
fgets(line,1000,in);
for (i=0;i<k;i++){
for (j=0;j<2;j++){
int tmp ;
fscanf(in ,"%d", &tmp) ;
arr[i][j] = tmp ;
}
}
fclose(in);
return 0; }
答案 0 :(得分:2)
两个主要问题:
第一个是第一个循环将读取所有行,甚至是行上带有单个数字的行。这意味着孤独的fgets
电话不会做任何事情,更重要的是k
的价值将是错误的。
第二个问题是,一旦你从文件中读取了所有数据,你就不会回到文件的开头,而是继续尝试从文件末尾读取。
第一个问题可以通过跳过第二个fgets
来电并将k
减少一个来解决。
第二个问题可以通过在计算行数后调用rewind
来解决。
另外,当你真正阅读这些数字时,你不需要内循环,只需要这样做。
scanf("%d %d", &arr[i][0], &arr[i][1]);
实际上,您根本不需要第一个行计数循环,您可以在一个循环中完成所有操作,方法是使用fgets
和sscanf
然后检查返回值sscanf
。所以你的程序可能看起来像
#include <stdio.h>
int main(void)
{
int values[100][2];
FILE *input = fopen("file.txt", "r");
size_t entries = 0;
if (input != NULL)
{
char buffer[40];
while (fgets(buffer, sizeof(buffer), input) != NULL && entries < 100)
{
int res = sscanf(buffer, "%d %d", &values[entries][0], &values[entries][1]);
if (res <= 1 || res == EOF)
{
// Read the last line with only one number, or an error happened
values[entries][0] = 0;
values[entries][1] = 0;
break;
}
++entries;
}
if (ferror(input))
{
printf("Error reading file\n");
}
fclose(input);
}
// All done, the number of "records" or "entries" is in the variable entries
// Example code: print the values
for (size_t i = 0; i < entries; ++i)
printf("Line %d: %d %d\n", i + 1, values[i][0], values[i][1]);
return 0;
}