C语言实现文件间奇数行元素复制时无输出问题求助
代码无输出的原因排查
你的代码出不了结果,是几个叠加的逻辑错误导致的,没有复杂的深层问题:
- 字符读串了:
while循环的条件已经通过fgetc读了一个字符存到str里,进了循环体又立刻再读一次fgetc覆盖str的值,相当于每轮循环直接跳过一个字符读,文件流的位置完全乱掉,根本没法按顺序遍历文件内容。 - 换行判断永远不生效:你写的
if (str == "\n")是典型新手坑:双引号包起来的"\n"是字符串,本质是指向这个字符串的内存地址,而str是个单字节的字符值,拿字符和地址做等值比较,结果永远为假。这直接导致你的行数计数器nr从始至终停在初始值0,后面判断nr %2 !=0的写入分支永远不会触发,自然目标文件啥内容都没有。正确写法是用单引号包换行符,也就是str == '\n',这才是单字符的比较。 - 变量类型不匹配:
fgetc的返回值是int类型,要专门用来存-1的EOF标记,你用char类型存返回值,碰到特殊内容时会出现EOF判断失效,提前终止遍历。 - 漏了基础头文件:代码里用到的
fopen、fgetc这些函数都在stdio.h里声明,没写#include <stdio.h>的话编译都没法正常通过。 - 错误处理不完整:打开文件失败时只打了错误提示,没有终止程序,后续会对空的文件指针做读写,直接触发非法访问。
可实现预期功能的修正代码
#include <stdio.h> int main() { FILE *data_input = fopen("data.in", "r"); FILE *data_out = fopen("data.out", "w"); int str; int nr = 0; if (data_input == NULL || data_out == NULL) { printf("error"); // 打开失败直接退出,不继续跑后面的逻辑 if (data_input) fclose(data_input); if (data_out) fclose(data_out); return 1; } // 每轮只读一个字符,删掉原来多余的fgetc调用 while ((str = fgetc(data_input)) != EOF) { // 正确判断换行字符 if (str == '\n') { nr++; } // 匹配你最初的计数逻辑:nr为奇数时写入,对应第2、4行内容,和预期输出对齐 if (nr % 2 != 0) { fputc(str, data_out); } } fclose(data_input); fclose(data_out); return 0; }
验证逻辑:遍历示例源文件时,第一行的
6因为还没碰到换行,nr是0,不写入;碰到第一行末尾的换行后nr变成1,后续第二行的所有字符都会被写入目标文件;第二行读完碰到换行时nr变成2,第三行的3因为nr是偶数不写入;第三行读完碰到换行nr变成3,第四行的所有字符会被正常写入,最终目标文件的内容和你预期的完全一致。
内容的提问来源于stack exchange,提问作者something new
相关产品推荐
相关产品推荐

