从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或含有该行的watever。
#include 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
,它将在空格分隔符后停止..
尝试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); ...... }
我认为它会很好..
这看起来像是一个家庭作业问题,所以我会尽力给你一些好的建议。
首先,阅读fscanf函数的描述和“%s”转换的描述。
这是我对“%s”的描述中的一个片段:
匹配一系列非空白字符; 下一个指针必须是一个指向字符数组的指针,该字符数组足够长以容纳输入序列和终止空字符(’\ 0’),这是自动添加的。 输入字符串在空白处或最大字段宽度处停止,以先发生者为准。
以下是两个要点:
- 每个输入行都包含数字和空格字符。 因此该函数将读取一个数字,到达空格,然后停止。 它不会读取9个字符。
- 如果它确实读取了9个字符,则arrays中没有足够的空间来存储所需的10个字节 。 请注意,将添加“终止空字符”。 读取9个字符,加上1个空值,等于10.这是C编程中的常见错误,现在最好学习总是考虑任何C字符串中的终止空值。
现在,要修复此问题以将字符读入二维数组:您需要使用不同的函数。 查看C stdio函数列表。
看到任何有用的声音?
如果你还没有,我会给你一个暗示:恐惧。 它将从输入流中读取固定数量的字节。 在你的情况下,你可以告诉它总是读取9个字节。
这只有在保证每行被填充到9个字符时才有效。
另一个function是fgets。 再次,仔细阅读function文档。 fgets是另一个附加终止空值的函数。 然而! 在这种情况下,如果告诉fgets大小为9,fgets将只读取8个字符,并将终止空值写为第9个字符。
但还有另一种方式! 回到fscanf!
如果查看其他转换说明符,可以使用“%9c”读取9个字符。 如果使用此操作,则不会向字符串添加终止空值。
使用fread和fscanf“%9c”如果你想在其他函数(如printf)中将这9个字节用作字符串,则需要将缓冲区设置为10个字节,并且在每个fread或fscanf函数之后,您需要编写save[9] = '\0'
。
请务必仔细阅读文档。 C字符串函数有时会单向执行。 但不总是。