读取文件并另存为矩阵

时间:2016-06-22 15:17:15

标签: c arrays

我有一个这样的文件:

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; } 

1 个答案:

答案 0 :(得分:2)

两个主要问题:

第一个是第一个循环将读取所有行,甚至是行上带有单个数字的行。这意味着孤独的fgets电话不会做任何事情,更重要的是k的价值将是错误的。

第二个问题是,一旦你从文件中读取了所有数据,你就不会回到文件的开头,而是继续尝试从文件末尾读取。

第一个问题可以通过跳过第二个fgets来电并将k减少一个来解决。

第二个问题可以通过在计算行数后调用rewind来解决。

另外,当你真正阅读这些数字时,你不需要内循环,只需要这样做。

scanf("%d %d", &arr[i][0], &arr[i][1]);

实际上,您根本不需要第一个行计数循环,您可以在一个循环中完成所有操作,方法是使用fgetssscanf然后检查返回值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;
}