如何读取逗号分隔的TXT文件数据?fscanf无输出问题求助
解决fscanf读取CSV文件无输出的问题
问题场景
需要读取StudentList.txt中的逗号分隔数据,文件内容如下:
Olivia,SWANSON,F,29001,20 Emma,ONEILL,F,7900,19
编写的C语言代码如下:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char fname[20]; char sname[20]; char gender[2]; int ID; int age; fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r"); if(fp == NULL){ perror("Open fail."); exit(1); } while(fscanf(fp, "%s,%s,%s,%d,%d", fname, sname, gender, &ID, &age) == 5) { printf("%s, %s, %s, %d, %d\n", fname, sname, gender, ID, age); } fclose(fp); return 0; }
代码运行后无任何输出,核心问题出在对fscanf的格式匹配逻辑理解有误。
问题原因
fscanf的%s格式符会匹配所有非空白字符(空格、换行、制表符等才算空白字符),直到遇到空白字符才停止。所以第一个%s会把整行Olivia,SWANSON,F,29001,20全部读取到fname数组中(因为逗号不属于空白字符),后续的%s和%d都无法匹配到对应数据,fscanf返回的匹配成功字段数不是5,导致循环根本不会执行,自然没有输出。
解决方法
方法1:修改fscanf格式串,指定字段分隔符
使用%[^,]格式符,它的作用是匹配所有不是逗号的字符,直到遇到逗号为止,刚好适配CSV的逗号分隔规则。修改后的循环部分代码如下:
while(fscanf(fp, "%[^,],%[^,],%[^,],%d,%d", fname, sname, gender, &ID, &age) == 5) { printf("%s, %s, %s, %d, %d\n", fname, sname, gender, ID, age); }
注意:gender[2]的长度刚好能存储单个字符(比如'F')加上字符串结束符\0,符合要求。
方法2:先读整行再解析(更稳妥)
用fgets先读取整行数据到缓冲区,再用sscanf解析,这种方式可以避免因换行符、多余空格等导致的匹配问题,代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char line[100]; // 足够存储一行数据的缓冲区 char fname[20]; char sname[20]; char gender[2]; int ID; int age; fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r"); if(fp == NULL){ perror("Open fail."); exit(1); } while(fgets(line, sizeof(line), fp) != NULL) { // 去掉换行符(如果存在) line[strcspn(line, "\n")] = '\0'; if(sscanf(line, "%[^,],%[^,],%[^,],%d,%d", fname, sname, gender, &ID, &age) == 5){ printf("%s, %s, %s, %d, %d\n", fname, sname, gender, ID, age); } } fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者catlover
相关产品推荐
相关产品推荐

