我想读取我看起来像的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
为什么????
答案 0 :(得分:3)
fopen()
的结果,以确保文件已被打开。fscanf()
的结果以确保其成功并防止后续代码处理变量(可能未分配值)(它返回分配的数量)。< / LI>
" %d"
。代码将处理单行16个int
s与四行int
s相同。如果文件的格式为每行int
个,请使用fgets()
读取一行,然后使用sscanf()
提取int
%n
格式说明符,以确保处理完整缓冲区:
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);
}
}
答案 1 :(得分:1)
要获得所需的输出(1111,2222,...),请更改:
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
到:
fp1 = fopen("data.txt","r");
澄清:使用fopen
时,您应该写下您要阅读的文件名。在你的情况下,你必须写data.txt
,而不是exact_enumerated_config_442_cub_mc
...
没有此名称的文件,而且没有任何数据,如1 1 1 1,2 2 2 2,3 3 3 3,4 4 4 4 ...
有关详细信息,请访问:
wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen
以下是您的“已修改”(已删除多余/浪费/额外{
}
并已编写data.txt
)代码,可为您提供所需的输出:1 1 1 1,2 2 2 2,3 3 3 3,4 4 4 4。
它打印名为buffer
的数组。这意味着......
... 数据已成功复制!从 "data.txt"
到 buffer[4][4]
:
#include"stdio.h"
#include"stdlib.h"
int main()
{
FILE *fp1;
int i,j;
int buffer[4][4];
for ( i = 0; i < 4; i++ )
for ( j = 0; j < 4; j++ )
buffer[i][j] = 0;
fp1 = fopen("data.txt","r");
for(i=0; i<4; i++)
for(j=0; j<4; j++)
fscanf(fp1,"%d", &buffer[i][j]);
fclose(fp1);
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
printf("%d ",buffer[i][j]);
printf("\n");
}
return 0;
}
的 P.S。强> 的
如果data.txt
不包含
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
但是
1 1 1 1
2 2 2 2
3 3 3 3
4 444 // the last two elements are absent
程序将正确读取第1行,第2行和第3行,第4行的输出将为
4 444 0 0
它会打印4
,然后是444
,然后是0
和0
:最后两个元素是'0',因为buffer
已被零初始化,所以所有元素都改变了它们的值,但最后两个仍然是零。
答案 2 :(得分:1)
在字符串格式的开头添加空格" %d"
以避免换行问题
fscanf(fp1," %d", &buffer[i][j]);
顺便说一句,您可以使用以下代码
for(i=0;i<4;i++) {
fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}
答案 3 :(得分:0)
您说过想要阅读data.txt
,那么为什么要打开文件exact_enumerated_config_442_cub_mc
尝试更改此
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
到
fp1 = fopen("data.txt","r");