从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中的文件读取数据的主要内容,如果未能解决你的问题,请参考以下文章