首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中读取文件中的名称

在C中读取文件中的名称
EN

Stack Overflow用户
提问于 2012-03-09 00:07:43
回答 3查看 2.9K关注 0票数 4

我有一个这样的文件:

代码语言:javascript
复制
name1 nickname1
name2 nickname2
name3 nickname3

我希望我的程序读取该文件,并显示姓名/昵称情侣。

下面是我所做的:

代码语言:javascript
复制
users_file = fopen("users", "r");

  while(!feof(users_file))
  {
    fscanf(users_file, "%s %s", &user.username, &user.name);
    printf("%s | %s\n", user.username, user.nickname);
  }

下面是输出:

代码语言:javascript
复制
 name1 | nickname1 
 name2 | nickname2      
 name3 | nickname3 
 name3 | nickname3

为什么最后一个是重复的?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-09 00:10:55

您需要在fscanf()之后立即检查feof(),或者检查fscanf()本身的返回值。最后一个是重复的,因为由于到达eof,fscanf()不会将任何新数据读取到user.usernameuser.nickname中。

可能的修复方法:

代码语言:javascript
复制
/*
 * You could check that two strings were read by fscanf() but this
 * would not detect the following:
 *
 *    name1 nickname1
 *    name2 nickname2
 *    name3 nickname3
 *    name4
 *    name5
 *
 * The fscanf() would read "name4" and "name5" into
 * 'user.username' and 'user.name' repectively.
 *
 * EOF is, typically, the value -1 so this will stop
 * correctly at end-of-file.
 */
while(2 == fscanf(users_file, "%s %s", &user.username, &user.name))
{
    printf("%s | %s\n", user.username, user.nickname);
}

或者:

代码语言:javascript
复制
/*
 * This would detect EOF correctly and stop at the
 * first line that did not contain two separate strings.
 */
enum { LINESIZE = 1024 };
char line[LINESIZE];
while (fgets(line, LINESIZE, users_file) &&
       2 == sscanf(line, "%s %s", &user.username, &user.name))
{
    printf("%s | %s\n", user.username, user.name);
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-09 00:12:14

如果您将您的循环更改为:

代码语言:javascript
复制
while((fscanf(users_file, "%s %s", &user.username, &user.name))
{
    printf("%s | %s\n", user.username, user.nickname);
}

然后它应该可以工作,请注意,我们不检查EOF,我们让fscanf为我们检查。

票数 1
EN

Stack Overflow用户

发布于 2012-03-09 00:18:13

如果看到文件结束的情况,则feof()函数将返回true。如果是从文件中读取,情况可能并非如此。

有多种方法可以绕过这一点,is的工作(实际上也是hmjd所说的)是:

代码语言:javascript
复制
while (fscanf(users_file, "%s %s", &user.username, &user.name) == 2) {
  ...
}

fscanf的返回值是成功转换和分配的转换次数,因此如果在读取时获得EOF,这将与您预期的两个不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9620822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档