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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:51