C语言写文件时出现段错误及文件名异常问题求助
问题修复方案
一、段错误问题分析与修复
你推测的fgetc返回值类型问题确实是核心原因之一,同时代码里还有其他直接触发段错误的逻辑漏洞:
fgetc返回int类型(覆盖0~255的字符值和EOF(-1)),如果用有符号char存储,EOF会被截断为无效值,导致feof判断失效;- 当
pIn为NULL(文件未找到)时,函数没有终止,后续依然执行fclose(pIn),直接对空指针操作触发段错误; - 循环逻辑顺序错误:先处理字符再判断文件结束,会导致
EOF被错误传入tolower和putchar,同时最后一个有效字符会被重复处理。
修复后的完整代码:
void TraverseFile(char *inFile, char *outFile) { FILE *pIn = fopen(inFile, "r"); if (pIn == NULL) { printf("File not found\n"); return; // 文件未找到直接返回,避免后续非法操作 } FILE *pOut = fopen(outFile, "w"); if (pOut == NULL) { printf("The write file cannot be opened.\n"); fclose(pIn); exit(1); } int c; // 用int存储fgetc返回值,兼容EOF while ((c = fgetc(pIn)) != EOF) // 直接判断是否到达文件末尾 { c = tolower(c); putchar(c); fputc(c, pOut); } fclose(pOut); fclose(pIn); }
二、输出文件名旁的奇怪点问题
从图片显示的现象来看,这个异常是输出文件名包含不可见控制字符导致的,常见原因:
- 传入的
outFile字符串未正确以\0结尾,出现内存乱码; - 用户输入文件名时带入了换行符、制表符等不可见字符;
- 调用
TraverseFile时,outFile参数被错误赋值(比如缓冲区溢出导致的乱码)。
解决方法:
- 检查调用函数时的
outFile参数,确保是标准C字符串(以\0结尾,无多余不可见字符); - 如果是从用户输入获取文件名,读取后要清除末尾换行符:
char outFile[256]; fgets(outFile, sizeof(outFile), stdin); size_t len = strlen(outFile); if (len > 0 && outFile[len-1] == '\n') { outFile[len-1] = '\0'; }
- 可以在函数内打印文件名的十六进制值排查问题:
printf("输出文件名十六进制:"); for (int i=0; outFile[i]!='\0'; i++) { printf("%02x ", (unsigned char)outFile[i]); } printf("\n");
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

