从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字符串函数有时会单向执行。 但不总是。