Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
C:文件操作可以';我不知道如何通过文件操作简化这段代码_C_Scanf_Fseek - Fatal编程技术网

C:文件操作可以';我不知道如何通过文件操作简化这段代码

C:文件操作可以';我不知道如何通过文件操作简化这段代码,c,scanf,fseek,C,Scanf,Fseek,我一直在写这段代码,但我找不出哪里出了问题。 此程序确实编译并运行,但最终出现致命错误 程序读取一个文件并收集数字以计算总数(在将其转换为浮点值后)。然后读取文件并显示小于10.00的文件 我有一个名为myFile.txt的文件,包含以下内容: 詹姆斯----07.50安东尼----17.00 所以显示器应该是 总数是24.50 以下是小于10.00的一个: 詹姆斯,他得了07.50分 代码如下: int main() { int n =2, valueTest=0,count=0;

我一直在写这段代码,但我找不出哪里出了问题。 此程序确实编译并运行,但最终出现致命错误

程序读取一个文件并收集数字以计算总数(在将其转换为浮点值后)。然后读取文件并显示小于10.00的文件

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

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

所以显示器应该是

  • 总数是24.50
  • 以下是小于10.00的一个:
  • 詹姆斯,他得了07.50分
  • 代码如下:

    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);
    
    intmain()
    {
    int n=2,valueTest=0,count=0;
    FILE*FILE=NULL;
    浮子温度=00.00f,平均温度=00.00f,浮子温度=10.00f;
    float*totalNote=(float*)malloc(n*sizeof(float));
    int位置=0;
    char selectionNote[5+1],nameBuffer[10+1],noteBuffer[5+1];
    file=fopen(“c:\\myFile.txt”、“r”);
    fseek(文件,10,搜索集);
    
    而(valueTest您没有提到您使用的是什么平台和编译器。我将猜测MSVC和Windows,因为您的文件名使用的是Windows样式的路径

    您说代码可以编译并运行,但您是否打开了编译器中的警告?这可能会为您提供更多关于可能正在执行的错误操作的线索


    在修复了一些打字错误并添加了标准的include头之后,我在gcc中编译了您的代码,其中警告了
    fscanf
    格式字符串和参数之间的不匹配。特别是,您正在传递一个指向
    char
    数组的指针,这不是您的意思。您可能需要阅读有关数组和指针的内容在C语言中,例如在中。该文档中的其余条目也非常有启发性。

    最有可能的是,您的致命错误来自该语句

    fscanf(file,"%5s",&selectionNote); 
    
    通常,数组类型的表达式(如
    selectionNote
    )将隐式转换为指针类型(参见注释1),因此在这种情况下,
    &
    是不必要的:

    fscanf(file, "%5s", selectionNote);
    
    您没有解释代码应该做什么,所以我不确定如何告诉您如何重构它


  • 除非它是
    sizeof
    运算符或一元
    &
    运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“类型的数组”的表达式将转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是数组n左值。如果数组对象具有寄存器存储类,则行为未定义。--C语言标准(草案),第6.3.2.1节,第3段
  • 使用带有适当格式字符串(
    %f
    )的单个
    fscanf
    ),而不是使用
    fscanf
    ,然后再使用
    atof

  • 您可以使用
    fscanf
    中的返回值来终止循环,而不是使用变量
    valueTest
    和常量
    2

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

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

  • 读取文件的第二个循环(倒带
    后的循环)最好用
    for
    表示,而不是
    while

    for (count = 0; count < counter; count++)
    ...
    

  • 哦,是的,好的,我会调查的。对不起,我刚刚添加了这个计划的目的。我现在正在调查,谢谢你指出这一点!
    for (count = 0; count < counter; count++)
    ...
    
    fscanf(file,"%10s",&nameBuffer);
    strtok(nameBuffer, "-");