【发布时间】:2014-05-15 13:52:11
【问题描述】:
我有一个关于从文件中读取包含空格的字符串的问题。 这是我的函数,它从文件中读取数据并将其写入结构数组。 但是,如果第一个字符串的输入包含两个字符串和它们之间的空格,则第一个字符串转到第一个参数,第二个字符串转到第二个参数。 如何以必要的数据进入指定的结构字段的方式从文件中拆分行? 谢谢!
void readFileToDiary(FILE* file, drivingDiary* diaryTemp){
int i = 0;
file = fopen("test.txt", "r");
if (file == NULL)
printf("\nError opening file!\n");
else{
while (!feof(file)){
fscanf(file, "%s %s %d %s %s %d", diaryTemp[i].locationStart,
diaryTemp[i].timeStart, &diaryTemp[i].odometerStart,
diaryTemp[i].locationEnd, diaryTemp[i].timeEnd,
&diaryTemp[i].odometerEnd);
i++;
}
}
}
示例 文件内的行包含: 某地 13:40 10000 某地 14:45 10120
所以,
"some place" -> first field of structure,
13:40 -> second field,
10000 -> third field,
"some other place" -> fourth field,
14:45 -> fifth filed,
10120 -> sixth field.
UPD 工作版本在这里(没有 fscanf() 检查)!
void readFileToDiary(FILE* file, drivingDiary* diary){
int i = 0;
file = fopen("test.txt", "r");
if (file == NULL)
printf("\nError opening file!\n");
else{
while(fscanf(file, " %[a-zA-Z ]%[0-9:]%d %[a-zA-Z ]%[0-9:]%d%*[\n]",
diary[i].locationStart,
diary[i].timeStart,
&diary[i].odometerStart,
diary[i].locationEnd,
diary[i].timeEnd,
&diary[i].odometerEnd) != EOF)
i++;
}
}
}
【问题讨论】:
-
使用
getLine或fgets从文件中获取整行而不是使用strtok让每个字段用空格分隔怎么样? -
使用
fgets()/sscanf()。char buf[100]; while(fgets(buf, sizeof buf, stdin) != NULL)) { if (sscanf(buf, "%s %s %d %s %s %d", ...) != 6) Handle_FormatError(); ... } -
基本问题是您松散地使用了 string 的 4 个定义。 1) 以
'\n'结尾的文本文件行,2) 用“它们之间的空格”分隔的字符分组,3) 使用"%s"扫描由white-space分隔的char组>(不仅是' ')并试图将这三个保存为 4)C 字符串,char的数组终止并包括一个'\0'。建议更明确地说明您的目标或提供一些示例。 -
可能是双通来确定找到多少令牌。如果它大于字段编号,那么你连接两个连续的标记来填充一个字段。但是如果使用了多个空格的字符串,那就麻烦了。
-
可能在上下文
" %[a-zA-Z ]%[0-9:]%d %[a-zA-Z ]%[0-9:]%d"上是分开的,但在locationStart和locationEnd中会有尾随空格。一定要测试fscanf()结果。代码肯定需要使用除fscanf()之外的其他内容来完全满足您的目标。
标签: c string file parsing file-io