fscanf()读错误

时间:2014-09-02 00:48:21

标签: c file-io scanf

我有一个文本文件,我将首字母和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,其中包含"人物' s&# 34;信息。 文本文件如下所示:

John Robbins
Teresa Jones 

我的结构定义如下:

struct people {

char name[20];
};

人员宣言结构:

 struct people *persons[2];

声明新结构后,我使用以下代码读取名称:

for(i=0; i<2; i++)
{  
  fscanf(dp, "%[^\n]s", &persons[i].name[20]);
}

但是,一旦我将名称输出到控制台,我会收到以下内容:

hn Robbins
sa Jones

我做过广泛的研究,无法找到解决这个问题的方法。有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:5)

fscanf(dp, "%[^\n]s", &persons[i].name[20]);

这会将行读取到换行符,然后尝试读取将失败的s。新行的行将存储在人员结构中name数组的末尾之后(这意味着它将覆盖到persons数组的下一个元素。

你想要这样的东西:

fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
而不是 - 初始空格会跳过前导空格(包括前一行中的任何换行符。)%19[^\n]最多可读取19个字符或一个换行符并存储它,然后终止NULL(所以将用完整个20字节name数组,但不多用完。 %*[^\n]将读取该行的任何其他字符,直到(并且不包括)换行符并将其丢弃。

您还想检查fscanf来电的返回值,以确保它没有收到错误或文件结尾:

#define MAX_PEOPLE    2
struct people persons[MAX_PEOPLE];

i = 0;
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0)
    i++;