C 读取文件并另存为矩阵

C 读取文件并另存为矩阵,c,arrays,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

我有一个这样的文件:

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; } 
#包括
int main(){
int k=0,i,j,arr[100][100];
FILE*in=fopen(“FILE.txt”、“r”);
字符行[1000];
while(fgets(line,1000,in)!=NULL)k++;
fgets(线,1000,英寸);
对于(i=0;i两个主要问题:

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

第二个问题是,一旦从文件中读取了所有数据,就不会返回到文件的开头,而是继续尝试从文件结尾以外的地方读取

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

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


另外,当你实际读取数字时,你不需要内部循环,只需执行例如

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;
}
#包括
内部主(空)
{
整数值[100][2];
FILE*input=fopen(“FILE.txt”、“r”);
大小\u t条目=0;
如果(输入!=NULL)
{
字符缓冲区[40];
while(fgets(buffer,sizeof(buffer),input)!=NULL&&entries<100)
{
int res=sscanf(缓冲区,“%d%d”、&value[entries][0]、&value[entries][1]);
如果(res2个主要问题:

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

第二个问题是,一旦从文件中读取了所有数据,就不会返回到文件的开头,而是继续尝试从文件结尾以外的地方读取

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

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


另外,当你实际读取数字时,你不需要内部循环,只需执行例如

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;
}
#包括
内部主(空)
{
整数值[100][2];
FILE*input=fopen(“FILE.txt”、“r”);
大小\u t条目=0;
如果(输入!=NULL)
{
字符缓冲区[40];
while(fgets(buffer,sizeof(buffer),input)!=NULL&&entries<100)
{
int res=sscanf(缓冲区,“%d%d”、&value[entries][0]、&value[entries][1]);

如果(res),则无法将宏
NULL
存储为整数。通常不应将其值存储为整数。您需要
倒带
。并使用
int**arr;
安装
int arr[100][100]
不能将宏
NULL
存储为整数。通常不应将其值存储为整数。您需要
倒带
。并使用
int**arr;
安装的
int arr[100][100]
@iffřņtĞîRl更新了代码以处理
sscanf
不返回
2
。但您必须详细说明“用NULL记录1”的含义.
NULL
是一个空指针,您不应该将其分配给整数变量。您应该自己好好想想,我真的不喜欢为您编写代码,这只会让您学习复制粘贴。我希望得到这样的输出矩阵:[1 100;2 200;3 300;4 400;1 NULL];但无论如何,我会尝试回答:小问题:为什么要使用
if(res@iffřņtĞîRl更新代码来处理
sscanf
而不是以不同方式返回
2
。但您必须详细说明“用NULL记录1”是什么意思.
NULL
是一个空指针,您不应该将其分配给整数变量。您应该自己好好想想,我真的不喜欢为您编写代码,这只会让您学习复制粘贴。我希望得到这样的输出矩阵:[1 100;2 200;3 300;4 400;1 NULL];但无论如何,我会尝试回答:小问题:为什么要使用
if(res