fscanf跳过我的第一个角色

时间:2014-05-30 14:04:27

标签: c file printf scanf

目前我正在做我的C编程作业。我遇到一个问题,我需要使用fprintf将一些记录添加到文本文件中,然后使用fscanf显示文件中的所有记录。但这里显示问题。它只跳过文本中的第一个字符,并显示其余字符。 文本文件中的示例

hello haha 400 500 60
hello2 haha2 500 600 70

我们需要在命令提示符下显示fscanf此文件。但结果显示我......

ello haha 400 500 60
hello2 haha2 500 600 70

剩下的角色没问题,但对于第一个角色,它会被跳过。 所以这是我的代码。

Fscanf的一部分

if ((ch = fgetc(fp)) != EOF){
while(fscanf(fp,"%s %s %d %d %d",code,name,&cost,&price,&stock) == 5)
{
  printf("%-20s %-20s %-20d %-20d %-20d\n",code,name,cost,price,stock);
}
}else{
  printf("Record not found in the stock database.\n");
  puts("");
}

Fprintf的部分

fprintf(fp,"%s %s %d %d %d\n",code,name,cost,price,stock);

那么,如何阅读第一个字符?

3 个答案:

答案 0 :(得分:1)

你的fgetc(fp)读了第一个hello的第一个h,所以现在文件指针是hello的e。 fscanf的进一步调用将从e开始读取。一个简单的灵魂就是在if条件的while循环上方添加一个printf(“%c”,ch)。即,

if ((ch = fgetc(fp)) != EOF){
    printf("%c", ch);
    while(fscanf(fp,"%s %s %d %d %d",code,name,&cost,&price,&stock) == 5)
    {
      printf("%-20s %-20s %-20d %-20d %-20d\n",code,name,cost,price,stock);
    }
}else{
    printf("Record not found in the stock database.\n");
    puts("");
}

答案 1 :(得分:0)

你遇到的问题是fgetc()正在拉你的第一个角色,如评论中所述。为了获得第一个字符,您需要将此字符存储在某处并在开头将其附加到输出,或者使用不同的方法来检查第一个字符是否不是EOF。

请注意,如果您的第一个项目只有一个字符长,那么您也可能会导致明确的问题 - 那么您的fscanf()将不再有第一个要查看的字符串。

答案 2 :(得分:0)

if ((ch = fgetc(fp)) != EOF){
    ungetc(ch, fp);
    while(fscanf(fp,"%s %s %d %d %d",code,name,&cost,&price,&stock) == 5)