繁体   English   中英

从c中的文件读取数据

[英]reading data from file in c

我有一个名为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);
}

这看起来像是一个作业问题,所以我会尽力为您提供一些建议。

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

这是我对“%s”的描述中的一个片段:

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

以下是两个要点:

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

现在,要解决此问题,可以将字符读取到二维数组中:您需要使用其他函数。 查看您的C stdio函数列表。

看到有用的声音了吗?

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

仅在保证每行被填充为9个字符的情况下才有效。

另一个功能是fgets。 同样,请仔细阅读功能文档。 fgets是另一个函数,它附加一个终止null。 然而! 在这种情况下,如果您告诉fgets大小为9,则fgets将仅读取8个字符,并且它将终止空值写入第9个字符。

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

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

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

请务必仔细阅读文档。 C字符串函数有时会以一种方式做到这一点。 但不总是。

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

尝试fgets来做..它将逐行读取..

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

fgets使用的详细信息可以在这里找到:
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

--edited--

这是第二个

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

我认为它会很好..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM