You need to enable JavaScript to run this app. C语言实现文件间奇数行元素复制时无输出问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 06:54:08