C:文件操作无法弄清楚如何使用文件操作简化此代码

时间:2010-12-29 20:16:29

标签: c scanf fseek

我一直在研究这段代码,但我找不到有什么问题。 该程序确实编译并运行,但最终会出现致命错误。

程序读取文件并收集数字以计算总数(在将它们转换为浮动之后)。然后它读取文件并显示小于10.00

的文件

我有一个名为myFile.txt的文件,其中包含以下内容:

詹姆斯------ 07.50安东尼--- 17.00

所以显示应该是

  1. 总数为24.50
  2. 这是小于10.00的那个:
  3. 詹姆斯有07.50
  4. 以下是代码:

    int main()
    {
       int n =2, valueTest=0,count=0;
       FILE* file = NULL;
       float temp= 00.00f, average= 00.00f, flTen = 10.00f;
       float *totalNote = (float*)malloc(n*sizeof(float));
    
       int position = 0;
       char selectionNote[5+1], nameBuffer[10+1], noteBuffer[5+1];
    
       file = fopen("c:\\myFile.txt","r");
       fseek(file,10,SEEK_SET);
       while(valueTest<2)
       {
           fscanf(file,"%5s",&selectionNote);
           temp = atof(selectionNote);
           totalNote[position]= temp;
           position++;
    
           valeurTest++;
       }
    
       for(int counter=0;counter<2;counter++)
      {
              average += totalNote[counter];
      }
      printf("The total is : %f \n",average);
    
      rewind(file);
      printf("here is the one with less than 10.00 :\n");
    
      while(count<2)
      {
            fscanf(file,"%10s",&nameBuffer);
    
            fseek(file,10,SEEK_SET);
            fscanf(file,"%5s",&noteBuffer);
            temp = atof(noteBuffer);
    
            if(temp<flTen)
            { 
               printf("%s who has %f\n",nameBuffer,temp);
            }
            fseek(file,1,SEEK_SET);
            count++;
       }
       fclose(file);
    

    }

    我对c很新,发现它比c#或java更难。我想得到一些建议,以帮助我变得更好。我认为这段代码可能更简单。你觉得一样吗?

3 个答案:

答案 0 :(得分:1)

您没有提到您正在使用的平台和编译器。鉴于您的文件名使用的是Windows风格的路径,我会猜测MSVC和Windows。

你说代码编译并运行但是你打开了编译器的警告吗?这可能会为您提供更多关于您可能正在做的可能不正确的事情的线索。

在修复了一些拼写错误并添加了标准包含标题后,我在gcc中编译了你的代码,警告fscanf格式字符串和参数之间的不匹配。特别是,您正在传递一个指向char数组的指针,这不是您的意思。您可能想要阅读C中的数组和指针,例如在C FAQ。该文件中的其他条目也非常具有启发性。

答案 1 :(得分:0)

最有可能的是,您的致命错误来自声明

fscanf(file,"%5s",&selectionNote); 

通常,类似selectionNote的数组类型的表达式将隐式转换为指针类型(请参阅注释1),因此在这种情况下,&不是必需的:

fscanf(file, "%5s", selectionNote);

你没有解释代码应该做什么,所以我不确定如何告诉你如何重组它。


  1. 除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则表达式的类型为''数组类型''转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。 - C语言标准(草案n1256),第6.3.2.1节,第3段。

答案 2 :(得分:0)

  1. 不使用fscanf后跟atof,而是使用带有合适格式字符串fscanf)的单个%f

    fscanf(file, "%f", &totalNote[position]);
    
  2. 您可以使用fscanf的返回值进行循环终止,而不是使用变量valueTest和常量2

    while(fscanf(file, "%f", &totalNote[position]) != 0)
    ...
    
  3. 从文件读取的第一个循环必须同时扫描名称和数字,即使您只需要数字!

  4. 您可以在读取它们的同一循环中累积数字。如果你这样做,你可以删除数组totalNote(如果您认为扩展代码以使用数字进行其他操作,而不仅仅计算总数),则此“简化”不适用

    < / LI>
  5. 读取文件的第二个循环(rewind之后的循环)更好地用for表示,而不是while

    for (count = 0; count < counter; count++)
    ...
    
  6. 在同一个循环中,您绝对不需要使用fseek!它会混淆你的代码,所以它只会从文件中读取“James”,而不会继续“Anthony”

  7. 您可能希望在打印之前从名称中删除“----”填充;您可以使用strchrstrtok

    执行此操作
    fscanf(file,"%10s",&nameBuffer);
    strtok(nameBuffer, "-");