fopen持续返回NULL,无法统计texto.txt文件单词数求助
解决fopen返回NULL及单词统计代码的问题
一、fopen返回NULL的排查方案
即使文件存在仍打不开的常见原因及解决方法:
- 工作目录不匹配:程序运行时的当前目录和文件所在目录不一致。可以在代码中添加
getcwd(Windows系统替换为_getcwd)打印当前目录,确认文件是否在该路径下;或者直接使用文件的绝对路径(如"D:/code/texto.txt"或"/home/user/code/texto.txt")替换相对路径。 - 权限不足:当前用户没有文件读取权限。Linux/macOS下执行
chmod +r texto.txt赋予读权限;Windows右键文件→属性→安全,确保当前用户有读取权限。 - 文件名错误:注意大小写(Linux/macOS区分大小写,
Texto.txt和texto.txt是不同文件),检查是否有拼写错误或特殊字符。
二、代码错误修正及优化
原代码存在读取逻辑、字符串终止符缺失等问题,以下是修正后的完整代码:
#include <stdio.h> #include <unistd.h> // Linux/macOS用,Windows替换为#include <direct.h> int contadorPalabras(char str[]) { int k = 0, j = 0; // 跳过开头连续空格 while (str[k] == ' ') { k++; } // 处理空字符串情况 if (str[k] == '\0') { return 0; } while (str[k] != '\0') { if (str[k] == ' ') { j++; // 跳过连续空格,避免重复计数 while (str[k + 1] == ' ') { k++; } } k++; } // 若结尾是空格,减去多余计数 if (str[k - 1] == ' ') { j--; } return j + 1; } int palabras_en_txt() { char cad[10000]; int total, j = 0; FILE *fichero; // 打印当前工作目录,排查路径问题 char cwd[1024]; if (getcwd(cwd, sizeof(cwd)) != NULL) { printf("当前工作目录:%s\n", cwd); } fichero = fopen("texto.txt", "r"); if (fichero == NULL) { perror("打开文件失败"); // 输出具体错误原因,便于排查 return 404; } // 正确读取文件内容,避免越界和读取EOF int ch; while ((ch = fgetc(fichero)) != EOF && j < sizeof(cad) - 1) { cad[j++] = ch; } cad[j] = '\0'; // 必须添加字符串终止符,否则函数会读取垃圾数据 fclose(fichero); printf("文件内容:%s\n", cad); total = contadorPalabras(cad); printf("总单词数:%d\n", total); return total; } // 测试用主函数 int main() { palabras_en_txt(); return 0; }
主要修正点:
- 用
perror替代普通printf,输出具体错误原因(如权限不足、路径错误等)。 - 修正文件读取逻辑:用
fgetc != EOF作为循环条件,避免读取EOF字符到数组;同时限制数组下标,防止缓冲区溢出。 - 添加字符串终止符
'\0',保证contadorPalabras函数能正确识别字符串边界。 - 优化
contadorPalabras函数,处理空字符串、开头连续空格的情况,逻辑更严谨。 - 添加当前工作目录打印,方便排查路径问题。
内容的提问来源于stack exchange,提问作者Eric Ramirez
相关产品推荐
相关产品推荐

