C语言中调用fprintf无法将反转字符串写入输出文件的问题求助
字符串反转文件读写的问题排查与修复
fprintf无法正常将内容写入目标文件的问题,是多个代码逻辑、操作错误叠加导致的,具体问题和修正方式如下:
核心错误点
- 格式符参数不匹配
代码中写的fprintf(fout, "%s", str[i])存在类型错配:%s格式符要求传入的是字符串首地址,而str[i]是单个字符,这个字符值会被fprintf误解析为内存地址,要么触发非法内存访问的段错误,要么根本无法写入有效内容。单个字符写入文件时,应该用%c作为格式符。 - 反转遍历逻辑错误
你硬编码从数组下标49(即dim-1)开始倒序遍历,没有先获取fgets实际读入的有效字符串长度,遍历范围会包含大量未初始化的垃圾内存,完全达不到反转实际读入内容的效果。正确的处理逻辑是先通过strlen()拿到当前读到的字符串长度,从长度减一的下标位置倒序遍历到0下标。 - 输出文件未正确关闭
代码最后仅调用了fclose(fin)关闭输入文件,完全没有关闭打开的fout输出流。C标准库的文件流自带内存缓冲区,没有执行fclose(fout)时,fprintf写入的内容会一直滞留在内存缓冲区里,不会真正同步到磁盘文件,这是你看不到目标文件内容的最直接原因。 - 缺少文件打开异常判断
没有判断fopen的返回值,如果输入文件不存在、输出文件无写入权限,fopen会返回NULL,此时直接对空指针做读写操作会直接导致程序崩溃。 - 循环边界遗漏
原有循环条件是i > 0,即便修正其他错误,也会漏掉字符串下标为0的第一个字符,导致反转结果不完整。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define dim 50 int main(int argc, char const *argv[]) { FILE *fin; FILE *fout; char str[dim]; char nomefilein[dim]; char nomefileout[dim]; int i, str_len; printf("Inserisci il nome del file da leggere:\n"); scanf("%s", nomefilein); printf("Inserisci il nome del file da scrivere:\n"); scanf("%s", nomefileout); // 打开文件并做异常判断 fin = fopen(nomefilein, "r"); if (fin == NULL) { perror("打开输入文件失败"); exit(EXIT_FAILURE); } fout = fopen(nomefileout, "w"); if (fout == NULL) { perror("打开输出文件失败"); fclose(fin); exit(EXIT_FAILURE); } while (fgets(str, dim, fin) != NULL) { printf("%s", str); // 获取当前读入的字符串实际长度 str_len = strlen(str); // 从最后一个有效字符开始倒序遍历 for (i = str_len - 1; i >= 0; i--) { // 单字符写入替换原来的%s格式符 fprintf(fout, "%c", str[i]); } } // 两个文件流都要关闭,确保缓冲区内容写入磁盘 fclose(fin); fclose(fout); return 0; }
内容的提问来源于stack exchange,提问作者AntonelloP
相关产品推荐
相关产品推荐

