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

时间:2015-02-21 09:34:13

标签: c fopen fgets

我应该从命令行参数打开一个文件并在其中打印值。这是我的代码:

#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

我不知道这里发生了什么。

2 个答案:

答案 0 :(得分:1)

我在代码中做了两处更改。

变化

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

答案 1 :(得分:0)

您的问题是,您使用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