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

C语言如何按原格式遍历含空格换行的文本文件并处理单词

保留原格式解析并修改单词的C语言实现方案

问题描述

需要处理如下格式的文本文件:

fire dwarf stone
rock beer arrow lion
sword shield
archstone
dragon gold
silver
hall
goblet chest axe

其中“axe”后带有换行符(axe\n)。需求是将每个单词传入自定义函数处理后,完全保留原有的空格、换行位置输出修改后的单词。

作为C语言新手,遇到的核心问题:

  • 读取整行的方法能获取含空格的内容,但无法提取行内单个单词;
  • 使用fscanf("%s", word)遍历文件时,会自动跳过所有空白字符,无法检测换行符,也无法保留原格式;
  • 尝试逐字符遍历并通过缓冲区积累单词,但无法正确识别换行符;
  • 当前尝试的代码逻辑失效:
while (fscanf(filename, "%s", line) == 1) {
    if (...) {
        printf("%s ", line);
    } else {
        printf("%se ", line);
    }
    if (getchar() == '\n') printf("\n");
}

解决方案:逐字符遍历+单词缓冲区

核心思路是通过逐字符读取文件,将连续的非空白字符存入缓冲区形成单词;遇到空白字符(空格、换行)时,先处理缓冲区中的单词,再原样输出空白字符,以此完全保留原格式。

完整示例代码

#include <stdio.h>
#include <ctype.h>

// 自定义单词处理函数:示例为给单词末尾添加'e',可替换为你的逻辑
void process_word(char *word) {
    while (*word != '\0') {
        word++;
    }
    *word = 'e';
    *(word + 1) = '\0';
}

int main() {
    FILE *fp = fopen("input.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    char word_buf[100]; // 假设单个单词最长不超过99个字符,可按需调整
    int buf_idx = 0;
    int c;

    // 逐字符读取文件直到结束
    while ((c = fgetc(fp)) != EOF) {
        if (!isspace(c)) {
            // 非空白字符,存入单词缓冲区
            word_buf[buf_idx++] = c;
        } else {
            // 遇到空白字符,先处理缓冲区中的单词
            if (buf_idx > 0) {
                word_buf[buf_idx] = '\0'; // 给单词添加字符串结束符
                process_word(word_buf);
                printf("%s", word_buf);
                buf_idx = 0; // 重置缓冲区索引
            }
            // 原样输出空白字符,保留原格式
            putchar(c);
        }
    }

    // 处理文件末尾的最后一个单词(若文件不以空白字符结尾)
    if (buf_idx > 0) {
        word_buf[buf_idx] = '\0';
        process_word(word_buf);
        printf("%s", word_buf);
    }

    fclose(fp);
    return 0;
}

关键逻辑说明

  1. 逐字符读取:使用fgetc()逐个读取字符,能精准捕获空格、换行等所有空白字符,不会像fscanf那样自动跳过;
  2. 单词缓冲区:将连续的非空白字符存入缓冲区,积累成完整单词,确保每个单词能单独传入处理函数;
  3. 空白字符处理:碰到空格或换行时,先处理缓冲区中的单词,再原样输出空白字符,保证原格式完全不变;
  4. 末尾单词处理:若文件以单词结尾(而非空白字符),循环结束后需单独处理缓冲区中剩余的单词;
  5. 自定义处理逻辑:只需替换process_word()函数的实现,即可完成任意单词修改需求。

原代码失效原因

  • fscanf("%s")会自动跳过所有空白字符(包括空格、换行),无法获取格式相关的字符信息;
  • getchar()仅能读取fscanf剩余的单个空白字符,无法处理多个连续空格或换行的场景,导致格式丢失。

内容的提问来源于stack exchange,提问作者user20125552

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:43:11