【问题标题】:fscanf not saving the data to struct?fscanf 没有将数据保存到结构中?
【发布时间】:2013-11-10 04:33:30
【问题描述】:

我有一个结构数组,它们被保存到一个文件中。目前文件中有两行:

a a 1
b b 2

我正在尝试读取文件并将数据保存到结构中:

typedef struct book{ 
    char number[11];//10 numbers 
    char first[21]; //20 char first/last name
    char last[21]; 
} info;

info info1[500]
into num = 0;

 pRead = fopen("phone_book.dat", "r");

 if ( pRead == NULL ){

        printf("\nFile cannot be opened\n");
}
 else{

      while ( !feof(pRead) ) {

            fscanf(pRead, "%s%s%s", info1[num].first, info1[num].last, info1[num].number);

            printf{"%s%s%s",info1[num].first, info1[num].last, info1[num].number); //this prints statement works fine

            num++;
     }

}
//if I add a print statement after all that I get windows directory and junk code.

这让我觉得这些项目没有被保存到结构中。任何帮助都会很棒。谢谢!

编辑:好的,它确实可以很好地保存它,但是当我将它传递给我的函数时,它会给我垃圾代码。

当我调用它时:

sho(num, book);

我的表演功能:

void sho (int nume, info* info2){
     printf("\n\n\nfirst after passed= %s\n\n\n", info2[0].first); //i put 0 to see the first entry
}

【问题讨论】:

  • 1) 什么是into? 2) printf{ 是语法错误,不能正常工作。
  • 你能用文本编辑器打开文件“phone_book.dat”吗?
  • 请提供您真正使用的代码。它不能是您显示的代码,因为由于各种原因无法编译。
  • 这不是feof()的正确使用方式;您还需要错误检查对fscanf() 的调用。
  • 是的,我试图缩短我的代码来问这个问题对不起。

标签: c struct scanf


【解决方案1】:
  1. 我想你的意思是int num = 0;,而不是into

  2. printf{... 是语法错误,改为printf(...。

  3. 检查fscanf的结果,如果不是3则表示没有读取全部3个字符串。

  4. 不要使用 (f)scanf 读取字符串,至少在没有指定最大长度的情况下不能:

    fscanf(pRead, "%10s%20s%20s", ...);
    

    但是,更好的是,改用fgets

    fgets(info1[num].first, sizeof info1[num].first, pRead);
    fgets(info1[num].last, sizeof info1[num].last, pRead);
    fgets(info1[num].number, sizeof info1[num].number, pRead);
    

    (当然还要检查fgets的结果)

  5. 确保num 不超过 499,否则你会溢出info

    while(num < 500 && !feof(pRead)){.
    

【讨论】:

  • 应该是fscanf(pRead, "%10s%20s%20s", ...,因为0-终止符需要保留1个字符。
  • @Kninnug 我将添加 fscanf(pRead, "%10s%20s%20s", ...);一会儿。但是为什么它在播放垃圾代码而不是在我的函数中保存的数据?
【解决方案2】:

1.-为了更好地处理错误,建议使用fgets(),在sscanf() 中使用宽度,验证sscanf() 结果。
2.-feof(pRead)的OP使用容易误用-建议fgets()

char buffer[sizeof(info)*2];   
while ((n < 500) && (fgets(buffer, sizeof buffer, pRead) != NULL)) {
  char sentinel;  // look for extra trailing non-whitespace.
  if (sscanf(buffer, "%20s%20s%10s %c", info1[num].first, 
      info1[num].last, info1[num].number, &sentinel) != 3) {
    // Handle_Error
    printf("Error <%s>\n",buffer);
    continue;
  }
  printf("%s %s %s\n", info1[num].first, info1[num].last, info1[num].number);
  num++;
}

顺便说一句:如果名字或姓氏中存在空格,则使用%s 效果不佳。

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2021-11-20
    • 2013-02-08
    • 2014-02-09
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多