从c中的文件读取数据

Posted

技术标签:

【中文标题】从c中的文件读取数据【英文标题】:reading data from file in c 【发布时间】:2011-05-18 04:39:14 【问题描述】:

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

【问题讨论】:

有几件事:它应该是int main(),你应该在它的末尾return 0;,并且FILE *prob;应该在main()中声明(没有理由让它外部) . 【参考方案1】:

如果你使用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); ......

我认为它会运作良好..

【讨论】:

对不起,我的错..我忘了 fgets 返回一个指针.. 所以,试试这个.. 'while(!feof(prob)) fgets(save, sizeof(save), prob) ; .....'【参考方案2】:

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

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

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

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

这里有两个重点:

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

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

看到什么有用的声音了吗?

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

只有在每行保证填充到 9 个字符时才有效。

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

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

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

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

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

【讨论】:

(fscanf(prob, "%9c", save) != EOF) 给了我一些接近答案的东西,但现在一些奇怪的字符正在打印出来。它没有打印新行是吗?

以上是关于从c中的文件读取数据的主要内容,如果未能解决你的问题,请参考以下文章

从c中的文件读取数据

如何用C语言统计一个数据文件中的数据个数

C语言怎么做到从文件中读取一行数据,然后改变这一行内容

.NET如何从配置文件中读取数据

Java中从文件中读取数据用啥函数

angular读取文件