C语言读取制表符分隔的多行多类型TXT文件问题求助
解决制表符分隔的带空格字符串读取问题
问题根源
fscanf的%s格式说明符会在**任何空白字符(空格、制表符、换行)**处停止读取,这就是你读取带空格的字符串时被截断、后续字段错位读取,进而无法处理下一行的原因。
方案1:使用%[^\t]格式符直接读取
利用%[^\t]可以读取所有字符直到遇到制表符为止,完美适配带空格的字符串字段。同时注意处理字符字段前后的空白,避免读取到制表符或空格。
示例代码:
#include <stdio.h> int main() { FILE *fp = fopen("data.txt", "r"); if (!fp) { perror("Failed to open file"); return 1; } int id; char str1[256], str2[256], c, str3[256]; // 循环读取每行数据,直到文件结束或读取失败 while (fscanf(fp, "%d\t%[^\t]\t%[^\t]\t %c\t%[^\n]\n", &id, str1, str2, &c, str3) == 5) { // 输出验证读取结果 printf("ID: %d\nStr1: %s\nStr2: %s\nChar: %c\nStr3: %s\n\n", id, str1, str2, c, str3); } // 读取失败时清理缓冲区,避免死循环 int ch; while ((ch = fgetc(fp)) != '\n' && ch != EOF); fclose(fp); return 0; }
代码说明:
%d\t:读取整数后跳过制表符%[^\t]:读取所有字符直到遇到制表符,匹配带空格的字符串字段%c\t:前面的空格用于跳过制表符后的空白(比如示例中\t b \t里的空格),确保准确读取目标字符%[^\n]:读取到换行符为止获取最后一个字符串字段,\n跳过当前行的换行符
方案2:先读整行再分割(更稳定)
如果担心换行符或缓冲区问题,可以先用fgets读取整行,再用sscanf分割处理,避免逐字段读取时的换行干扰。
示例代码:
#include <stdio.h> #include <string.h> int main() { FILE *fp = fopen("data.txt", "r"); if (!fp) { perror("Failed to open file"); return 1; } int id; char line[1024], str1[256], str2[256], c, str3[256]; while (fgets(line, sizeof(line), fp) != NULL) { // 去掉行尾的换行符 line[strcspn(line, "\n")] = '\0'; // 分割整行数据 if (sscanf(line, "%d\t%[^\t]\t%[^\t]\t %c\t%[^\t]", &id, str1, str2, &c, str3) == 5) { printf("ID: %d\nStr1: %s\nStr2: %s\nChar: %c\nStr3: %s\n\n", id, str1, str2, c, str3); } } fclose(fp); return 0; }
注意事项
- 确保定义的字符数组大小足够容纳最长的字符串字段,避免缓冲区溢出
- 假设字段内部不包含制表符(符合“字段间用制表符分隔”的规则),如果字段内有制表符,需要改用其他分割方式
- 如果字符字段前后没有空白,可以去掉
%c前面的空格,直接用%c\t
内容的提问来源于stack exchange,提问作者Szabolcs
相关产品推荐
相关产品推荐

