从c中读取文件中的数据

时间:2011-05-18 04:39:15

标签: c file file-io save

我有一个名为prob的txt文件,其中包含:

  6 2 8 3
4   98652
      914
143   789
    1    
527   146
 85      
 1 74   8
7   6 3  

每行有9个字符,共有9行。由于我不能在c中创建一个字符串数组,我正在使用二维数组。仔细运行代码,无限循环很常见,它打印出奇怪的输出。我也很好奇它在哪里停止接受字符串?直到换行? 每个“保存”的预期结果:6 2 8 3 或者包含所包含的行。

#include <stdio.h>
FILE *prob;

main()
{ 
    prob = fopen("prob.txt", "r");

    char grid_values[9][9];
    char save[9];

    int i;
    for (i = 0; (fscanf(prob, "%s", save) != EOF); i++)
    {
        int n;
        for (n = 0; n <= 9; n++)
        {
            grid_values[i][n] = save[n];
            printf("%c", grid_values[i][n]);
        }
    }
    fclose(prob);
}

2 个答案:

答案 0 :(得分:4)

这看起来像是一个家庭作业问题,所以我会尝试给你一些好的建议。

首先,阅读fscanf函数的说明和“%s”转换的说明。

以下是我对“%s”的说明:

  

匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,该字符数组足够长以容纳输入序列和终止空值    字符('\ 0'),自动添加。输入字符串在空格或空格处停止                 在最大场宽,以先发生者为准。

以下是两个要点:

  • 每个输入行都包含数字和空白字符。因此该函数将读取一个数字,到达空白,然后停止。它不会读取9个字符。
  • 如果它确实读取了9个字符,则阵列中没有足够的空间来存储所需的 10个字节。请注意,将添加“终止空字符”。读取9个字符,加上1个空,等于10.这是C编程中的一个常见错误,现在最好学习总是考虑任何C字符串中的终止空值。

现在,要修复此问题以将字符读入二维数组:您需要使用不同的函数。查看您的C stdio函数列表。

看到有用的声音吗?

如果你还没有,我会给你一个暗示:恐惧。它将从输入流中读取固定数量的字节。在你的情况下,你可以告诉它总是读取9个字节。

只有当每行保证被填充为9个字符时,这才有效。

另一个功能是fgets。再次,仔细阅读功能文档。 fgets是另一个附加终止空值的函数。然而!在这种情况下,如果告诉fgets大小为9,fgets将只读取8个字符,并将终止空值写为第9个字符。

但还有另一种方式!回到fscanf!

如果查看其他转换说明符,可以使用“%9c”读取9个字符。如果您使用操作,将不会向字符串添加终止空值。

对于fread和fscanf“%9c”,如果你想在其他函数(如printf)中将这9个字节用作字符串,则需要使缓冲区为10个字节,并且在每个fread或fscanf函数之后需要写save[9] = '\0'

请务必仔细阅读文档。 C字符串函数有时以一种方式完成。 但并非总是如此。

答案 1 :(得分:3)

如果您使用fscanf,它将在空格分隔符后停止..

尝试fgets这样做..它将逐行阅读..

for (i = 0; (fgets(save, sizeof(save), prob) != EOF); i++)

fgets用法的细节可以在这里找到:
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

- 编辑 -

这是第二个

while(!feof(file))
{
    fgets(s, sizeof(s), file); ......
}

我认为它会运作良好..