我用的是这个语句:多行数据 while(fscanf(fa,"%d%s%s\n",&a1,a2,a3)!=EOF 代码太长了

如题所述

fscanf返回的是实际读取的数据个数,碰到错误或者文件结束返回-1(EOF)。 也就是说最后一行不为空并且少于3个项目,那么就会死循环,
应该这样做
while(!feof(fa))
{
fscanf(fa,"%d%s%s\n",&a1,a2,a3);
}
或者文件里没有空行的话,也可以 while(fscanf(fa,"%d%s%s\n",&a1,a2,a3)!=0来判断 ,但这样不可靠,有不匹配的项的话,还会出问题追问

while(!feof(fa))
{
fscanf(fa,"%d%s%s\n",&a1,a2,a3);
}
这样我做过,是不行的。我的“]”符号就是自己占据一行的

!=0请问,怎么不可靠啊?我的文件里在一些数据后都是空行,最后出现个]符号,和您说的应用情况不符啊

追答

这就是不匹配引起的,因为第一个项目是%d ,那么读入']'就是不匹配情况,这就会导致fscanf拒绝读取,最后死循环
这样

while(!feof(fa))
{
if (fscanf(fa,"%d%s%s\n",&a1,a2,a3)==0)
{
fgetc(fa); // 把不匹配的字符读掉
}

}

你这个属于文件格式问题,必须满足特定格式才行

追问

是的,我的A文件格式一定。现在总结下:我们可以用以下几种方法:
1,用!=0判断 ,您还没说怎么不可靠那,刚才我试了下,对我们的问题好用。
2,用您刚才给的while(!feof(fa))
{
if (fscanf(fa,"%d%s%s\n",&a1,a2,a3)==0)
{
fgetc(fa); // 把不匹配的字符读掉
}

}
3,把我的%d变成%c估计也成吧?
呵呵

追答

%d换成%c 也不好,两位数以上的数字就会出问题,并且读出来的数据不能当数字使用

用!=0判断 ,您还没说怎么不可靠那,刚才我试了下,对我们的问题好用。

用!=0 如果有两项缺少第三项怎么办, 所以要求格式统一

来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜