我使用的IDE是Clion。我想读取 .txt 文件中存储的行分隔数据。每行包含名字、姓氏、性别、ID 和年龄,分别为 str、str、str、int 和 int。
学生名单.txt
Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19
Run Code Online (Sandbox Code Playgroud)
我尝试用它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;
Run Code Online (Sandbox Code Playgroud)
但它返回的结果看起来有点奇怪,因为它不输出第二个值。
结果是
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;
Run Code Online (Sandbox Code Playgroud)
让我震惊的是,在 PellesC 中运行相同的代码会得到正确的结果。
我曾经学过C++,所以C中可能存在一些重要的规则,但我没有注意到。谁能为我展示一下吗?
"%s"无宽度
切勿使用不带宽度的"%s"in*scanf()来指示要读取和保存的最大非空白字符数。回想一下,读取后,会附加一个空字符。示例:如果缓冲区大小为 100,则代码最多只能读取 99。
char gender[1];对于 来说太小了"F"。
错误检查
fscanf(fp, "%s %s %s %d %d", ...)可以返回5或 之外 的其他值EOF。因为只有这样才是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;
Run Code Online (Sandbox Code Playgroud)