繁体   English   中英

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

[英]fgets() printing the last line twice in 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM