C语言 关于循环读取多行文件的问题

请问,我有以下程序段,而且能够成功实现2个文件中的多行数据比较功能,但我不知道,
#include <stdio.h>
#include <string.h>
main()
{
int AS1=0,AS3=0,BS1=0,BS2=0,BS3=0;
float AS2=0;
char lineA[100]={0},lineB[100]={0},AS0[13]={0},BS0[13]={0};
FILE *fpA,*fpB,*fpC;
fpA = fopen("A.txt","r");
fpC = fopen("C.txt","w");
fprintf(fpC,"数量\t大小\t属性\t地点\t时间\t顺序\n");
fgets(lineA,sizeof(lineA)-1,fpA);
while ( fscanf(fpA,"%s %d %f %d\n",AS0,&AS1,&AS2,&AS3)!=EOF )
{
fpB = fopen("B.txt","r");
fgets(lineB,sizeof(lineB)-1,fpB);
while ( fscanf(fpB,"%s %d %d %d\n",BS0,&BS1,&BS2,&BS3)!=EOF )
{
if (strcmp(AS0,BS0)==0)
{
fprintf(fpC,"%d\t%.1f\t%d",AS1,AS2,AS3);
fprintf(fpC,"\t%d\t%d\t%d\n",BS1,BS2,BS3);
}
}
fclose(fpB);
}
fclose(fpA);
fclose(fpC);
}
while ( fscanf(fpB,"%s %d %d %d\n",BS0,&BS1,&BS2,&BS3)!=EOF )
这个语句读到多行数据尾后是如何回到fB文件首的?

这段程序应该是存在问题的,在第一个while循环里你打开了文件B.txt,退出循环前已经关闭,即在第二个while循环的时候,B.txt文件是关闭的,所以while ( fscanf(fpB,"%s %d %d %d\n",BS0,&BS1,&BS2,&BS3)!=EOF )这句代码会出错,可以这样
fpB = fopen("B.txt","r");

while ( fscanf(fpB,"%s %d %d %d\n",BS0,&BS1,&BS2,&BS3)!=EOF )

{}
这其实是重新打开了文件B.txt,自然数据指针是在文件首的追问

可是没有提示错误,比较也正常的,第一个循环后已经关闭,第二个循环又打开了呀,您说的没太懂啊?

追答

嗯,因为你把fpB = fopen("B.txt","r");这句代码一直放在第一个while里循环,也就是说循环一次就打开关闭文件一次,文件重新打开,数据指针在文件首。

温馨提示:内容为网友见解,仅供参考
无其他回答

c语言 读写文件时怎么样一次读取几行,然后再几行几行的往下读取
用双重循环语句,就可以再几行几行地读。例如:include <stdio.h> include <stdlib.h> FILE *fin;main(){ char s[20][200];int i,j;fin=fopen("abc.txt","r"); \/\/ 打开文件 for (i=0;i<4;i++) fgets(s[i],200,fin); \/\/ 以字符串形式 读4行 for (i=0;i<4;i+...

C语言用fgets()从文件读取多行字符时出现的问题
其实这是没有必要的,我们可以随意指定一个合理的数,比如说5,3,10等都可以。我们只要不断地向流拿数据然后原样输出就可以了。只要别在输出函数中加一些其他多余的东西我们就可以将一行分多次读取,同时行与行之间的\\n也是一样的需要注意的是我们输出时要用fgets函数的返回值,而不是缓冲区 ...

C语言 scanf读取多行的问题
我也遇到过这个问题,这个是因为scanf在接收到你给的第一行字符后,在要接收下一行字符时,把你留在缓存的回车字符接收了进来,然后就自动运行了(你输入回车换行的时候,回车字符会被记入缓存)。所以可以你scanf的语句后面跟一个语句来清空缓存。语句为: fflush( stdin ); 就可以实现读取多行了。

C语言中如何读入多行字符串,其行数未知,结束标志未知。即能够代替C++中...
feof()可以判读文件指针有没有到达末尾,没到达返回0,可以用这个循环做

C语言中文件操作问题,一个文件中有多行字母,如何在函数中统计有多少行...
使用文件读取操作,每次读一行,使用一个变量进行统计没进一次循环变量累积加1 给你一个demo,这个demo是每次读一行文本,通过转化操作后存入另一个文本里面 include<stdio.h>int main(){ char buffer[1024]; unsigned char hex[16]; unsigned char num1,num2,num3,num4,num5,num6,num7...

c语言 如图,为什么只能读取文件的奇数行。么才能全部读取。 在while循环...
你这应该是读取了文件的偶数行,而非基数行。getLine(非标准库函数)和 fread 都是类似作用的:读取一行,然后把结果放进指定的字符串里。从你的代码可见你调用了 getLine 后又马上调用 fread,也就是这两个操作读取了两行,后一个操作读取到的第二行代码,把之前读取到的第一行代码给覆盖了。

标准C语言中如何一次读取某文件中的多行数据
一、以fscanf读取。fscanf读取时,默认会到空白字符截止。所以如果文件中不存在其它空白字符,那么可以以fscanf实现一次性读取多行的效果,比如文件中存储为 12.3name那么要一次性读取这三行数据,可以使用:int a;float b;char c[20];fscanf(fp, "%d%f%s",&a,&b,c);其中,fp为打开该文件的文件...

c语言读取txt文件多行数据
"); return -1; } while (!feof(fp))\/\/循环读取每一行,直到文件尾{ fgets(strLine, MAX_LINE,fp); \/\/将fp所指向的文件一行内容读到strLine缓冲区printf("%s", strLine); \/\/输出所读到的内容\/\/DO SOMETHING ELSE} fclose(fp);\/\/关闭文件printf("\\n");return 0; } 用一维数...

C语言 多组数据输入,每次输入多行怎么实现?
要实现在 C 语言中多组数据的多行输入,可以使用循环结构来重复读取每组数据的多行输入。下面是一个示例代码,演示了如何实现这一功能:include <stdio.h> int main() { int numCases; \/\/ 组数 scanf("%d", &numCases); \/\/ 输入组数 for (int caseNum = 1; caseNum <= numCases; ++cas...

c语言从文件循环读取两行内容,然后用malloc申请内存分别存储两行内容...
malloc 的地方看了没有问题,应该是哪里堆写溢出了,把堆写坏了。malloc的时候会检查堆的完整性。

相似回答