我想读取我的 data.txt 文件,它看起来像并将它存储在一个名为 buffer[i][j] 的数组中
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
我写的代码看起来像
#include"stdio.h"
#include"stdlib.h"
int main() {
FILE *fp1;
int i,j;
int buffer[4][4]={0};
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
fscanf(fp1,"%d", &buffer[i][j]);
}
// fscanf(fp1,"\n");
}
fclose(fp1);
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
printf("%d ",buffer[i][j]);
}
printf("\n");
}
}
但我得到了输出...
1 1 2 1
5 1 6 1
17 1 18 1
21 1 22 1
为什么????
最佳答案
- 始终检查
fopen()
的结果以确保文件已打开。 - 始终检查
fscanf()
的结果以确保它成功并防止后续代码处理可能未分配值的变量(它返回分配的数量)。 - 在格式说明符中添加一个前导空格字符以跳过空格,包括换行符:
"%d"
。
该代码将处理具有 16 个 int
的单行与具有四个 int
的四行相同。如果文件的格式是每行四个 int
很重要,那么使用 fgets()
读取一行然后使用 sscanf()
提取带有 %n
格式说明符的 int
以确保处理完整缓冲区:
int ints[4][4] = { { 0 } };
char buffer[1024];
for (int i = 0; i < 4 && fgets(buffer, 1024, fp); i++)
{
int pos;
if (sscanf(buffer,
"%d %d %d %d%n",
&ints[i][0],
&ints[i][1],
&ints[i][2],
&ints[i][3],
&pos) != 4 || pos != strlen(buffer) - 1)
{
fprintf(stderr, "Invalid format: <%s>\n", buffer);
exit(1);
}
}
关于c - 如何使用 fscanf 读取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216799/