当我用fscanf读取第二行时,为什么会得到一个空字符?

时间:2013-04-08 18:27:31

标签: c

我试图完全读取文件的第一行,直到\n并将其存储在变量中。然后我尝试读取文件的第二行,但它没有给出正确的输出。我不确定发生了什么。是读取空白,还是文件指针在fscanf()之后移动?

abc.txt文件包含:

>hello test file<br>
1

但输出(我在printf中得到的)是:

status:
>pwd :hello test file

那么为什么这里缺少身份?

这是我的计划:

#include <stdio.h>
#include <string.h>

int main()
{
  char status,pwd[30];
  FILE *fp;
  fp=fopen("abc.txt","r");
  if(fp == NULL)
    {
        printf("Cannot open file ");
        fclose(fp);
       return 0;
    }

  fscanf(fp,"%29[^\n]",pwd);  
  fscanf(fp,"%c",&status);

  fclose(fp);
  printf("\n Status : %c pwd: %s",status,pwd);
}

2 个答案:

答案 0 :(得分:3)

这里:

 fscanf(fp,"%29[^\n]",pwd);  

你告诉fscanf()在看到换行符之前阅读,然后停止。这里:

 fscanf(fp,"%c",&status);

你告诉fscanf()阅读下一个字符(换行符)。然后在这里:

printf("\n Status : %c pwd: %s",status,pwd);

它将换行符打印为一个字符(所以你看不到它,它只是一个空行)

如果你想用fscanf()这样读它,你需要使用那个新行。

一种选择就是做一些事情:

fscanf(fp,"%29[^\n]",pwd); 
fgetc(fp);
fscanf(fp,"%c",&status);

另一个解决方案是在%c之前添加一个空格,告诉fscanf()忽略空格字符:

fscanf(fp,"%29[^\n]",pwd); 
fscanf(fp," %c",&status);

答案 1 :(得分:1)

第一个fscanf正在放回换行符,所以第二个fscanf只是读取换行符,而不是你想要的字符。你可以通过在%c之前加一个空格来解决这个问题,例如

fscanf(fp," %c",&status);