如何在C中从文件读取整数到1D数组

时间:2014-05-14 09:04:53

标签: c arrays io

我正在尝试从txt文件中读取整数并将它们存储在一维数组中。我尝试了几种方法,但无法正常工作。 我的文本文件在

下面
1 2
2 1
3 2
2 1
1 2
2 1
3 2
2 1
1 2
2 1
3 2
2 1

这是我的代码

#include <stdio.h>
#include <stdlib.h>

int main(void) // usually we write void when main doesn't take args
{
    int i;
    int j;

    /*matrix*/

    int *mat = malloc((12* 2* sizeof ( int))); // no casting!


    FILE *file;
    file=fopen("test.dat", "r");   // extension file doesn't matter
    if(!file) {
        printf("File not found! Exiting...\n");
        return -1;
    }

    for(i = 0; i < 12; i++)
    {
        for(j = 0; j < 2; j++)
        {
            if (!fscanf(file, "%d", &mat[i*2 + j])){
                printf("error!\n");
                break;
            }

            //fscanf(file, "%d", &mat[i*2 + j]);
            printf("ok!\n");

            printf("%d \t",mat[i*2 + j]); // mat[i][j] is more clean
        }
        printf("\n");

    }

    free(mat);
    fclose(file);

    return 0;
}

感谢您的帮助! 的 ****** **** UPDATE 我发现第一个问题是我无法读取文件,但后来发现我只能打印一个值,而不是24个值

./print_mat 
ok!
1   error!

error!

error!

error!

error!

error!

error!

error!

error!

error!

error!

error!

2 个答案:

答案 0 :(得分:3)

代码很好。可能segmentation fault的原因是文件无法打开(可能无法找到文件)。

如果文件中包含的数据不如预期,则可能会出现问题。

你可以这样检查:

#include <stdio.h>
#include <stdlib.h>

int main(void) // usually we write void when main doesn't take args
{
    int i;
    int j;

    /*matrix*/

    int *mat = malloc((12* 2* sizeof ( int))); // no casting!


    FILE *file;
    file=fopen("test.txt", "r");   // extension file doesn't matter
    if(!file) {
        printf("File not found! Exiting...\n");
        return -1;
    }

    for(i = 0; i < 12; i++)
    {
        for(j = 0; j < 2; j++)
        {
            if (!fscanf(file, "%d", &mat[i*2 + j]))
                break;
            printf("ok!\n");

            printf("%d\n",mat[i*2 + j]); // mat[i][j] is more clean
        }

    }

    free(mat);
    fclose(file);

    return 0;
}

Why not to cast what malloc returns

[编辑]

更好的错误输出可以这样做:

if(!file) { // equivalent to file == NULL
    perror("File not found! Exiting...\n");
    return -1;
}

现在,当无法打开文件时,您将获得perror内的输出 以及错误消息。

我试图打开一个不存在的文件并获得

File not found! Exiting...
: No such file or directory

您可能没有与主文件位于同一目录中的文件。

致Olaf Dietsche和pmg的评论。

正如另一个答案所述,您始终可以使用debugger来查找问题所在。 很多人使用valgrind

当OP发现时,scanf()将无法解析文件,当值以逗号而不是空格分隔时。

答案 1 :(得分:0)

我已经测试了你的程序,并且在我的配置上它运行时没有出错。

您机器的配置是什么?编译器等?

也许您应该检查工具valgrind以在执行期间查找内存泄漏,请参阅:http://www.cprogramming.com/debugging/valgrind.html 它帮助我追踪了一些seg故障。