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
相关产品推荐
相关产品推荐

