Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一旦到达不包含正在扫描的值的行,Fscanf将在循环中返回相同的值_C_Scanf - Fatal编程技术网

一旦到达不包含正在扫描的值的行,Fscanf将在循环中返回相同的值

一旦到达不包含正在扫描的值的行,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的初始值。随后读取的每一行表示将对这些现在存储的值执行的操作。例如

我试图创建一个程序,从文本文件中读取数据,并对存储在不同帐号(由数字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的初始值。随后读取的每一行表示将对这些现在存储的值执行的操作。例如,读取“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