C 为什么我的FSF总是跳过随机数?

C 为什么我的FSF总是跳过随机数?,c,file-io,scanf,C,File Io,Scanf,基本上,我需要扫描这个文件中的所有值…它基本上是这样做的,但它似乎跳过了随机值,所以它最终没有正确排列。这只是我需要做的作业的一部分,所以你不会给出答案,我仍然想自己解决这个问题,只是需要一点帮助来解决这个问题,因为我被卡住了 代码如下: int main() { FILE *fp; char x[15]; float ID [1000]; int i=0, j=0; float homework [1000]; float lab [1000];

基本上,我需要扫描这个文件中的所有值…它基本上是这样做的,但它似乎跳过了随机值,所以它最终没有正确排列。这只是我需要做的作业的一部分,所以你不会给出答案,我仍然想自己解决这个问题,只是需要一点帮助来解决这个问题,因为我被卡住了

代码如下:

int main()
{
    FILE *fp;
    char x[15];
    float ID [1000];
    int i=0, j=0;
    float homework [1000];
    float lab [1000];
    float midterm [1000];
    float Final [1000];
    int count=0;
    char headers[35];
    char y;

    fp= fopen("lab5_inputFile.txt", "r");

    while (fscanf(fp, "%s", x)!=EOF){
        if (count > 728){
            fscanf(fp, "%f", &ID[i]);
            printf("ID : %.1f\n", ID[i]);
            fscanf(fp, "%f", &homework[i]);
            printf("Homework: %.1f\n", homework[i]);
            fscanf(fp, "%f", &lab[i]);
            printf("lab: %.1f\n", lab[i]);
            fscanf(fp, "%f", &midterm[i]);
            printf("Midterm: %.1f\n", midterm[i]);
            fscanf(fp, "%f", &Final[i]);
            printf("Final: %.1f\n", Final[i]);

            i++;
        }
            count ++;

    }
    printf("count = %d\n", count);
    fclose(fp);
我只扫描了最后几个值,以便于阅读/调试,在实际代码中,我只会跳过标题,在提交之前,我还计划更改很多其他内容,比如我可能使用指针类型和malloc,而不是数组和其他一些内容,但我的主要问题是如何解决从文件读入数组的问题


提前谢谢

您每次都跳过第一行x。您应该将其改写为:

char x[100];
/* while (fscanf(fp, "%s", x)!=EOF){ */
fgets(x, 100, fp);  /* Skip first line */
for(; /* ever */; ) {
    if(5 == fscanf(fp, "%f%f%f%f%f", &ID[i], &homework[i], &lab[i], &midterm[i], &Final[i])) {
       printf("ID : %.1f\n", ID[i]);
       printf("Homework: %.1f\n", homework[i]);
       printf("lab: %.1f\n", lab[i]);
       printf("Midterm: %.1f\n", midterm[i]);
       printf("Final: %.1f\n", Final[i]);
       i++;
    } else break;
}

OP的方法重复读取一组非空白文本,然后读取5个数字。代码应该读一行,扔掉它,然后重复读5组数字

读第一行,然后用fgets读到EOF。用sscanf或strtod扫描缓冲区


@Mohit Jain fscanf返回读取的字符数不正确。fscanf返回已转换或EOF的字段数。养成阅读正在使用的每个函数的文档的习惯,例如。。。。使用所有警告和调试信息gcc-Wall-Wextra-g编译。使用调试器gdb。你不需要问就可以找到你的问题!为什么代码会忽略对fscanf的前728次调用的结果?需要忽略文件的第一行,而不是下面任何一行建议在顶部附近插入fgets;越过第一条线。然后,以下所有对fscanf的调用都需要有一个包含前导“”的格式字符串,因此所有空白都将被占用/跳过。此外,对fscanf的每个调用都需要检查返回值,以确保转换成功,即如果1!=fscanf。。。{//handle error}使用“1”,因为对fscanf的所有调用都只转换一个参数。因此,有必要定义一个结构,该结构包含一个字段,用于从文件中的每一行读取的每个项。然后定义1000个这些结构的数组的实例。这将清理代码,使其更易于遵循,并在以后维护代码中发生的事情。feoffp的方法不正确。OP的文本文件以“\n”结尾,您的答案在以数字结尾的文件中计数。当文件以数字以外的内容结尾时,最后一个fscanf%f,&Final[i];未设置EOF,并且出现额外的5个fscanf。请使用以“\n”结尾的文本文件尝试您的解决方案以查看该问题。测试每个fscanf的结果,而不是iffeoffp,尤其是最后一个fscanf的结果。@chux我尝试读取所有值。如果文件在读取完所有文件后仍不读取eof,我将递增I,声明读取成功。否则,我至少在fscanf上声明失败。虽然OP的调试输出会显示未经验证的声音,就像您没有尝试在建议的输入上运行代码一样。如果成功读取的最后一个数字后面有空格,则feof将不为真,然后下一组5个fscanffp,%f。。。一切都将失败。由于代码未检查fscanf的结果,因此未检测到此失败。在这些失败之后,feof将成为现实。为清楚起见,feof不会通知不再有可用数据,feof通知先前的IO操作检测到不再有可用数据。如果文件在读取所有数据后仍不读取eof,则I增量I是一个问题。1代码不知道单个fscanf是否工作,例如输入了非数字2问题是下一个fscanffp,%f,&ID[i];可能会失败,因为没有更多的数字可读取。该代码未检测到该故障,可在通过iffeoffp break中断前执行5次故障fscanf;建议查看。@chux感谢您共享link.fgets dummy、sizeofdummy、fp将无法按预期工作。sizeofdummy是指针的大小,可能是4或8。建议定义N 1000。。。fgets dummy,N,fp。注意:格式为fscanffp,%f,。。。这是不需要的。这也不是问题。有趣的是,这段代码对studentGrades使用了一个本地数组,对dummy使用了一个分配数组。很高兴能展示各种各样的大型数组定义,否则不清楚为什么这两种方法不同。
char buf[100];
fgets(buf, sizeof buf, fp);  // Read and toss first line
i = 0;

while (fgets(buf, sizeof buf, fp) != NULL) {  // Read until EOF
  if ((i >= 1000) || (sscanf(buf, "%f%f%f%f%f", &ID[i], &homework[i], &lab[i], 
      &midterm[i], &Final[i]) != 5)) {
    fputs("Quit as too many lines or ill formatted\n", stderr);
    break;
  }
  printf("ID : %.1f\n", ID[i]);
  printf("Homework: %.1f\n", homework[i]);
  printf("lab: %.1f\n", lab[i]);
  printf("Midterm: %.1f\n", midterm[i]);
  printf("Final: %.1f\n", Final[i]);
  i++;
}
#include <stdio.h>
#include <stdlib.h>

struct grade
{
    float ID;
    float homework;
    float lab;
    float midterm;
    float final;
};

#define ARRAYSIZE (1000)

int main()
{
    FILE *fp;
    struct grade studentGrades[ARRAYSIZE] = {{0},{0},{0},{0},{0}};
    int i=0;
    int count=0;


    if( NULL == (fp= fopen("lab5_inputFile.txt", "r") ) )
    {
        perror( "fopen for read of lab5_inputFile.txt" );
        exit(1);
    }

    // implied else fopen successful

    char* dummy = malloc(1000*sizeof(char) );
    if( NULL == dummy )
    {
        perror( "malloc for dummy buffer" );
        exit(2);
    }

    // implied else, malloc successful

    char * firstLine = fgets( dummy, sizeof(dummy), fp ); // step past first line of file
    if( NULL == firstLine )
    {
        perror( "fget of first line of file" );
        exit(3);
    }

    // implied else, fgets successful

    free( dummy );

    int itemCount = 0;
    for ( i = 0; i < ARRAYSIZE; i++ )
    {
        itemCount = fscanf(fp, " %f", &studentGrades[i].ID);
        if( EOF == itemCount ) // Note:making assumption that every line, 
                               // after first, is properly formatted
        {
            break; // exit for loop
        }
        if( 1 != itemCount )
        {
            perror("fscanf");
            exit(4);
        }

        // implied else read of ID successful, not end of file

        printf("ID : %.1f\n", studentGrades[i].ID);

        if( 1 != fscanf(fp, " %f", &studentGrades[i].homework) )
        {
            perror( "fscanf of homework");
            exit(5);
        }

        // implied else, read of homework successful

        printf("Homework: %.1f\n", studentGrades[i].homework);

        if( 1 != fscanf(fp, " %f", &studentGrades[i].lab) )
        {
            perror( "fscanf of lab" );
            exit(6);
        }

        // implied else, read of lab successful

        printf("lab: %.1f\n", studentGrades[i].lab);

        if( 1 != fscanf(fp, " %f", &studentGrades[i].midterm) )
        {
            perror( "fscanf of midterm" );
            exit(7);
        }

        // implied else, read of midterm successful

        printf("Midterm: %.1f\n", studentGrades[i].midterm);

        if( 1 != fscanf(fp, " %f", &studentGrades[i].final) )
        {
            perror( "fscanf of final" );
            exit(8);
        }

        // implied else, read of final successful

        printf("Final: %.1f\n", studentGrades[i].final);

        count ++;

    } // end for

    printf("count = %d\n", count);
    fclose(fp);

    return(0);
}