fscanf没有将数据保存到struct?

时间:2013-10-30 14:27:16

标签: c struct scanf

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

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
}

2 个答案:

答案 0 :(得分:3)

  1. 我认为你的意思是int num = 0;,而不是into

  2. printf{ ...语法错误,printf( ...而不是。

  3. 检查fscanf的结果,如果不是3,则表示尚未读取所有3个字符串。

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

    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)){.
    

答案 1 :(得分:0)

1. - 为了更好地处理错误,建议使用fgets(),使用sscanf()中的宽度,验证sscanf()结果。
2.-feof(pRead)的使用容易被滥用 - 建议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++;
}

BTW:如果第一个名称或姓氏中存在空格,则使用%s无效。