繁体   English   中英

fscanf 中的值丢失

[英]Values lossing in fscanf

我用的IDE是Clion。 我想读取存储在 .txt 文件中的行分隔数据。 每行包含名字、姓氏、性别、ID 和年龄,分别为 str、str、str、int 和 int。

学生名单.txt

Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19

我尝试使用fscanf来读取数据。

FILE *fp;
char fname[20];
char sname[20];
char gender[1];
int ID;
int age;
fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
while(fscanf(fp, "%s %s %s %d %d", fname, sname, gender, &ID, &age)!= EOF)
{
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
}
fclose(fp);
return 0;

但是它返回的结果看起来有点奇怪,因为它不是 output 第二个值。

结果是

Olivia,,F,29001,20
Emma,,F,7900,19

令我震惊的是,在 PellesC 中运行相同的代码会导致正确的结果。

我以前学过C++所以C里面可能有一些重要的规则但是我没有注意到。 谁能给我看一下?

"%s"没有宽度

切勿在没有宽度的*scanf()中使用"%s"来指示要读取和保存的非空白字符的最大数量。 回想一下,在读取之后,附加了一个null 字符 示例:如果缓冲区大小为 100,则代码最多只能读取 99。
char gender[1]; 对于"F"来说太小了。

错误检查

fscanf(fp, "%s %s %s %d %d", ...)可以返回5EOF以外的其他值。 因为只有5是可以接受的,所以要针对它进行测试。

测试开启成功

如果fopen()失败, fscanf()fclose()是坏的

其他问题也存在*

但是让我们从修复上述问题开始。


char fname[20 + 1];
char sname[20 + 1];
char gender[1 + 1];
int ID;
int age;
FILE *fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
if (fp) {
  while(fscanf(fp, "%20s %20s %1s %d %d", fname, sname, gender, &ID, &age) == 5) {
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
  }
  fclose(fp);
}
return 0;

您还需要有空间来容纳null字节。

char gender[1];

char gender[2];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM