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

C语言连续调用fwrite()未输出count变量内容问题求助

问题原因

  • 你用fwrite(&count, sizeof(int), 1, stdout)直接写入int变量的二进制内容到标准输出,二进制的整数值和可显示的数字ASCII字符不是一回事,比如数值3的二进制int在终端显示为不可见的控制字符,所以你看不到对应数字,误以为fwrite没有执行。
  • 循环读取完文件所有内容后,最后一组连续字符的统计结果没有触发写入逻辑,没有输出到流中。
  • 额外隐患:没有判断fopen的返回值,文件不存在/无权限打开时会触发空指针访问崩溃。

解决方法

  1. 把写入计数的逻辑换成printf("%d", count),或者自己把整数转成字符序列后用fwrite输出,确保输出的是可显示的数字字符。
  2. 循环结束后补一次写入逻辑,把最后一组连续字符和计数输出。
  3. 增加fopen失败的错误判断。

修改后代码

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

int main (int argc, char* argv[]) {
        FILE* fp;
        char c, currentchar;
        int flag = 0, count = 1;

        if (argc < 2) {
                printf("wzip:insufficient args\n");
                exit(1);
        }
        fp = fopen(argv[1], "r");
        // 新增文件打开失败判断
        if (fp == NULL) {
                printf("wzip: cannot open file\n");
                exit(1);
        }

        while ( fread(&c, sizeof(char), 1, fp) == 1) {
                if (flag == 1) {
                        if (c == currentchar) {
                                ++count;
                        }
                        else {
                                fwrite(&currentchar, sizeof(char), 1, stdout);
                                // 替换fwrite为printf输出数字
                                printf("%d", count);
                                currentchar = c;
                                count = 1;
                        }
                }
                if (flag == 0) {
                        currentchar = c;
                        flag = 1;
                }
        }
        // 新增:输出最后一组统计结果
        if (flag == 1) {
                fwrite(&currentchar, sizeof(char), 1, stdout);
                printf("%d", count);
        }
        printf("\n");
        fclose(fp);
        return 0;
}

内容的提问来源于stack exchange,提问作者Srijan-Sriv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:24:02