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