一旦到达不包含正在扫描的值的行,Fscanf将在循环中返回相同的值
我试图创建一个程序,从文本文件中读取数据,并对存储在不同帐号(由数字1-5表示)中的值执行函数,同时使用这些帐号旁边的字符执行某些函数(即,“1 D 200.00”表示在帐号1的值上加200个值)。文本文件的格式是这样的一旦到达不包含正在扫描的值的行,Fscanf将在循环中返回相同的值,c,scanf,C,Scanf,我试图创建一个程序,从文本文件中读取数据,并对存储在不同帐号(由数字1-5表示)中的值执行函数,同时使用这些帐号旁边的字符执行某些函数(即,“1 D 200.00”表示在帐号1的值上加200个值)。文本文件的格式是这样的 20000.00 10000.00 2500.00 67500.00 15000.00 2 W 200.00 4 D 50.00 1 B 2 U 3 W 125.00 扫描前5个值,然后将其用于表示账户1-5的初始值。随后读取的每一行表示将对这些现在存储的值执行的操作。例如
20000.00
10000.00
2500.00
67500.00
15000.00
2 W 200.00
4 D 50.00
1 B
2 U
3 W 125.00
扫描前5个值,然后将其用于表示账户1-5的初始值。随后读取的每一行表示将对这些现在存储的值执行的操作。例如,读取“2 W 200.00”的行指向科目2,对该科目使用提款功能,并使用浮动修改该功能(因此从科目2的值中减去200.00)
为了测试这些值是否以正确的方式被扫描和存储,我首先让程序运行一个循环,在这个循环中,它扫描前5行之后的所有值并打印它们。代码如下:
FILE*bankfile;
bankfile = fopen("bankfile.txt","r+");
for(i = 1; i < 15; i++)
{
if(i < 6)
{
fscanf(bankfile,"%f",&accValue);
switch(i)
{
case 1:
acc1 = accValue;
break;
case 2:
acc2 = accValue;
break;
case 3:
acc3 = accValue;
break;
case 4:
acc4 = accValue;
break;
case 5:
acc5 = accValue;
break;
}
}
else
{
fscanf(bankfile,"%d %c %f",&accNum,&accAction,&actValue);
printf("%d %c %f\n",accNum,accAction,actValue);
}
}
printf("Exited Loop");
等等,直到程序完成
是否有办法让该程序识别该行的actValue值不存在,并继续下一行?根据:
函数fscanf()
返回成功填充的参数列表的项数。由于匹配失败、读取错误或到达文件末尾,此计数可以与预期的项目数匹配,也可以小于(甚至为零)
您可以测试fscanf()
的返回值,如果循环无法读取预期的项数,则退出循环
输入文件可能有错误:如果读取失败,测试此值允许您打印错误消息
在文件的第行:
1 B
2 U
程序读取1b2
,然后尝试将U
读取为整数,但失败
由于换行符是文件格式的关键部分,请遵循@BlueMoon的建议:使用来读取整行,然后使用来解析该行
不要在同一字符串上多次使用sscanf()
,也不要读取
您还可以测试
sscanf()
的返回值,以检查行是否已成功读取。这就是scanf系列函数的工作方式。当格式说明符不匹配时,它们不会向前移动文件指针。使用fgets()
和sscanf()
。
1 B
2 U