【问题标题】:fscanf () read errorfscanf() 读取错误
【发布时间】:2014-09-02 00:48:21
【问题描述】:

我有一个文本文件,我正在将名字和姓氏读入一个大小为 20 的字符数组中。我正在创建一个包含“人物”信息的结构数组。 文本文件如下所示:

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

我进行了广泛的研究,但找不到解决此问题的方法。有人遇到过这个问题吗?

【问题讨论】:

  • 请显示 person 数组的声明。
  • 刚刚添加了“Persons”结构体的声明
  • 你在声明中将 Persons 大写但在使用时没有大写是否只是一个错字?
  • 是的,这只是一个错字
  • 您的代码甚至无法编译。 people[i] 不是结构,而是指向结构的指针。

标签: c file-io scanf


【解决方案1】:
fscanf(dp, "%[^\n]s", &persons[i].name[20]);

这会将行读取到换行符,然后尝试读取s,这将失败。换行符之前的行将存储在 people 结构中 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++;

【讨论】:

  • 根据persons的张贴声明应该是persons[i]-&gt;name
  • 是的,他需要将声明更改为struct people persons[2];,否则他的代码甚至无法编译。使其成为一个指针数组也需要为其分配空间。
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多