我是编程新手,现在正在学习C语言。尝试从文件读取数据并将其存储在char数组中时遇到问题。
我的输入是这样的:
Hayes,Darrell,Covey,Dasia,Hayes,Neftaly
Ashby,Angela,Chapman,Ebony,Ashby,Elliott
我的代码是这样的:
while(1) {
int ret = fscanf(fp," %[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",
g_human_array[g_human_count].last_name,
g_human_array[g_human_count].first_name,
g_human_array[g_human_count].mother_last,
g_human_array[g_human_count].mother_first,
g_human_array[g_human_count].father_last,
g_human_array[g_human_count].father_first
);
printf("%s,%s,%s,%s,%s,%s,%d\n",
g_human_array[g_human_count].last_name,
g_human_array[g_human_count].first_name,
g_human_array[g_human_count].mother_last,
g_human_array[g_human_count].mother_first,
g_human_array[g_human_count].father_last,
g_human_array[g_human_count].father_first,ret
);
if(ret != 6) {
fclose(fp);
return READ_BAD_RECORD;
}
但是,我的输出却被这样弄乱了:
Hayes,Darrell,Covey,Dasia,hby,Neftaly
Ashby,6
6
,,,,,,0
0
human_t和g_human_array的定义如下:
typedef struct human_struct {
char father_first[NAME_LENGTH];
char father_last[NAME_LENGTH];
char mother_first[NAME_LENGTH];
char mother_last[NAME_LENGTH];
char first_name[NAME_LENGTH];
char last_name[NAME_LENGTH];
} human_t;
human_t g_human_array[MAX_HUMANS];
答案 0 :(得分:4)
%[^,]
将匹配任何不包含逗号的字符串。这意味着换行符 将包含在它匹配的字符串中,因此最后一个%[^,]
将匹配包含一个行的最后一个字段和下一行的第一个字段的字符串。将其更改为%[^,\n]
,以便在换行符之间不匹配。
int ret = fscanf(fp," %[^,],%[^,],%[^,],%[^,],%[^,],%[^,\n]",
g_human_array[g_human_count].last_name,
g_human_array[g_human_count].first_name,
g_human_array[g_human_count].mother_last,
g_human_array[g_human_count].mother_first,
g_human_array[g_human_count].father_last,
g_human_array[g_human_count].father_first
);
另一种解决方案是使用fgets()
一次读取一行,然后使用sscanf()
对其进行处理。但是您仍然必须记住,fgets()
将换行符留在缓冲区中,因此您必须先将其删除,然后再使用sscanf()
进行处理,或者像上面我一样将\n
放入排除集中