[英]After using fscanf to get to a specific line, how to read that entire line?
[英]How to read a multi line using fscanf
我想读取看起来像的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
的单行与与具有4个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);
}
}
要获取所需的输出(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;
}
PS
如果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
程序将正确读取第一行,第二行和第三行,并且第四行的输出为
4 444 0 0
它先输出4
,然后输出444
,然后输出0
和0
:最后两个元素为'0',因为buffer
已由零初始化,因此所有元素均更改了其值,但最后两个元素仍为零。
在字符串格式的开头添加空格,应为" %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]);
}
您已经说过要读取data.txt
然后为什么要打开文件exact_enumerated_config_442_cub_mc
尝试改变这个
fp1 = fopen("exact_enumerated_config_442_cub_mc","r");
至
fp1 = fopen("data.txt","r");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.