我使用的IDE是Clion。我想读取存储在.txt文件中的行分隔数据。每行包含名、姓、性别、ID和年龄,即str、str、str、int和int。
StudentList.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;
但是它返回的结果看起来有点奇怪,因为它没有输出第二个值。
结果为
Olivia,,F,29001,20
Emma,,F,7900,19
令我震惊的是,在PellesC中运行的相同代码会产生正确的结果。
我曾经学习过C++,所以C中可能存在一些重要的规则,但我没有注意到。谁能给我演示一下吗?
2条答案
按热度按时间nbysray51#
"%s"
不带 * 宽度*不要在
*scanf()
中使用"%s"
,而不使用宽度来指示要读取和保存的非空白字符的最大数量。请记住,阅读后,将追加一个 * 空字符 *。示例:如果缓冲区大小为100,则代码最多只能读取99。char gender[1];
对于"F"
来说太小。错误检查
fscanf(fp, "%s %s %s %d %d", ...)
可以传回5
或EOF
以外的其他值。因为只有5
是可接受的,所以请针对它进行测试。测试打开成功
如果
fopen()
失败,则fscanf()
、fclose()
是坏的还存在其他问题*
但让我们从修复上面的使用开始。
f3temu5u2#
您还需要有空间来容纳
null
字节。至