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

C语言读取文件行并提取!与$间字符串时输出空文件的问题求助

问题分析与解决方案

看起来你的代码现在输出为空,核心问题出在文件打开模式错误和提取逻辑逻辑混乱上,咱们一步步来解决:

一、导致输出为空的直接原因:文件打开模式用错了

你用fopen("C:\\Users\\Pc\\Desktop\\ups.txt","a+")打开要读取的文件,a+模式的特性是:

  • 打开文件用于读写,但文件指针初始位置在文件末尾
  • 如果文件不存在则自动创建它

这就意味着fgets(input,512,string)从一开始就读取不到任何内容,循环直接跳过,自然输出文件是空的。读取原文件应该用"r"模式(只读),写入新文件用"w"模式(覆盖写入,要追加内容就用"a")。

二、原提取逻辑的问题

你之前的代码里把!替换成字符串结束符、用memmove移动$后面的内容,这个逻辑完全没法正确提取!和$之间的内容。比如你给出的示例行,原逻辑会把字符串截断得乱七八糟,根本得不到想要的结果。

三、修正后的代码

下面是实现你需求的正确代码,我加上了详细注释:

#include <stdio.h>
#include <string.h>

int main(void) {
    // 打开要读取的文件,使用只读模式"r"
    FILE *input_file = fopen("C:\\Users\\Pc\\Desktop\\ups.txt", "r");
    if (input_file == NULL) {
        printf("无法打开输入文件!\n");
        return 1;
    }

    // 打开要写入的文件,使用写入模式"w"(若文件存在会清空,需要追加用"a")
    FILE *output_file = fopen("C:\\Users\\Pc\\Desktop\\ups.m3u", "w");
    if (output_file == NULL) {
        printf("无法打开输出文件!\n");
        fclose(input_file);
        return 1;
    }

    char line[512];
    // 逐行读取输入文件内容
    while (fgets(line, sizeof(line), input_file) != NULL) {
        // 去掉行尾的换行符(避免输出多余空行)
        line[strcspn(line, "\n")] = '\0';

        char *current_pos = line;
        // 循环查找一行中所有!和$的配对
        while (1) {
            // 找到下一个!的位置
            current_pos = strchr(current_pos, '!');
            if (current_pos == NULL) break; // 没有更多!,退出循环
            current_pos++; // 跳过!,指向内容的起始位置

            // 找到对应!的$位置
            char *end_pos = strchr(current_pos, '$');
            if (end_pos == NULL) break; // 没有匹配的$,退出

            // 临时把$替换成字符串结束符,方便提取内容
            *end_pos = '\0';
            // 写入输出文件,用空格分隔多个提取结果
            fprintf(output_file, "%s ", current_pos);
            printf("%s ", current_pos); // 控制台预览提取结果

            // 恢复$字符(不影响后续查找)
            *end_pos = '$';
            // 从$的下一个位置开始,继续查找下一对!$
            current_pos = end_pos + 1;
        }
        // 每行处理完后添加换行,和示例输出格式一致
        fprintf(output_file, "\n");
        printf("\n");
    }

    // 记得关闭所有打开的文件
    fclose(input_file);
    fclose(output_file);
    return 0;
}

四、代码说明

  • 文件模式修正:用"r"读取原文件确保能读到内容,"w"写入新文件确保输出正确
  • 提取逻辑:用strchr逐个定位!和对应的$,支持一行内多组!$配对提取(比如你示例里的两组内容)
  • 细节优化:自动去除行尾换行符,提取结果用空格分隔,和你期望的输出格式完全匹配

测试效果

对于你给出的原始行:

Beautifull!day today$ !hello world$is nice

运行代码后,输出文件会得到:

day today hello world

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:07:45