C语言连续调用fwrite()未输出count变量内容问题求助
问题原因
- 你用
fwrite(&count, sizeof(int), 1, stdout)直接写入int变量的二进制内容到标准输出,二进制的整数值和可显示的数字ASCII字符不是一回事,比如数值3的二进制int在终端显示为不可见的控制字符,所以你看不到对应数字,误以为fwrite没有执行。 - 循环读取完文件所有内容后,最后一组连续字符的统计结果没有触发写入逻辑,没有输出到流中。
- 额外隐患:没有判断
fopen的返回值,文件不存在/无权限打开时会触发空指针访问崩溃。
解决方法
- 把写入计数的逻辑换成
printf("%d", count),或者自己把整数转成字符序列后用fwrite输出,确保输出的是可显示的数字字符。 - 循环结束后补一次写入逻辑,把最后一组连续字符和计数输出。
- 增加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(¤tchar, sizeof(char), 1, stdout); // 替换fwrite为printf输出数字 printf("%d", count); currentchar = c; count = 1; } } if (flag == 0) { currentchar = c; flag = 1; } } // 新增:输出最后一组统计结果 if (flag == 1) { fwrite(¤tchar, sizeof(char), 1, stdout); printf("%d", count); } printf("\n"); fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者Srijan-Sriv
相关产品推荐
相关产品推荐

