You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:40