fgets()在C中打印最后一行两次



我应该从命令行参数打开一个文件并打印其中的值

#include <stdio.h>
int main(int argc, char* argv[])
{
  float num;
  char const* const filename=argv[1];
  FILE* file=fopen(filename,"r");
  char line[256];
  int j=0;
  while(fgets(line,sizeof(line),file)){
    for( j=0; j<2; j++ )
    {
      if(j == 0)
      {
           fscanf(file, "%f", &num);
           printf("%f t", num);
      }
      else if(j == 1)
      {
          fscanf(file, "%f", &num);
          printf("%f n", num);
      }
    }
  }
  fclose(file);
}

这是我想得到的输出:

1 1
2 2
3 3

这就是我实际得到的:

1 1
2 2
3 3
3 3

我不明白这里发生了什么。

我在您的代码中做了两个更改。

更改

fscanf(file,"%f",&num);

进入

sscanf(line,"%f",&num);// here

您在循环中读取输入,但从文件指针中获取值。所以第一行将被跳过。然后在打开文件流的同时制作测试用例。

if ( file == NULL)  { 
     perror("fopen");
     return;      
}

试试这个代码,我只做了上面的更改,

 #include <stdio.h>
 int main(int argc, char* argv[])
 {
    float num;
    char const* const filename=argv[1];
    FILE* file=fopen(filename,"r");
    if ( file == NULL)  { 
       perror("fopen");
      return;      
    }
    char line[256];
    int j=0;
    while(fgets(line,sizeof(line),file) != NULL){
            for(j=0; j<2;j++)
            {
                    if(j==0)
                    {
                            sscanf(line,"%f",&num);
                            printf("%f t",num);
                    }
                    if(j==1)
                    {
                            sscanf(line,"%f",&num);
                            printf("%f n",num);
                    }
            }
    }
    fclose(file);
 } 

输出:

 130.000000     130.000000
 210.000000     210.000000
 650.000000     650.000000
 324.000000     324.000000

您的问题是用fgets读取第一行,然后用fscanf开始读取下一行。换句话说,在fgets (line, LMAX-1, file)之后,文件位置指示器位于第1行的末尾。然后fscanf(file, "%f", &num);(它跳过第1行末尾的'n'并读取第2行的值)。您想要:

while (fgets (line, LMAX-1, file)) {
    for (j = 0; j < 2; j++) {
        if (j == 0) {
            sscanf (line, "%f", &num);
            printf ("%f t", num);
        } else if (j == 1) {
            sscanf (line, "%f", &num);
            printf ("%f n", num);
        }
    }
}

然后输出变为:

./bin/dbllast dat/dbllast.txt
1.000000        1.000000
2.000000        2.000000
3.000000        3.000000

最新更新