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

调用fopen()读取文件时指针为nil?技术问题求助

问题排查:readFile函数读取返回路径失败

我有一个server.conf文件,里面存着index.html的路径,index.html包含一段简单内容。我写了readFile()函数用来接收文件路径并返回文件内容(三个文件在同一目录)。直接传server.conf路径时函数正常执行,返回内容是"index.html";但用这个返回值再调用readFile()时,fopen()返回的文件指针是nil。

相关代码与文件内容

1. 主程序代码

#include <string.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define MAX_BUFFER      1024


char *readFile(char *filePath){
    
    FILE* fp = malloc(MAX_BUFFER);  
    char* fileContent = malloc(MAX_BUFFER);
    
    fp = fopen(filePath, "r");  
        printf("filepath is: %s\n", filePath);
        printf("pointer is: %p\n", fp);

    
    if (NULL == fp) {
        printf("file can't be opened \n");
    }
    
    while (fgets(fileContent, MAX_BUFFER, fp) != NULL) {
        printf("content of fileContent in readFile: %s\n", fileContent);
    }
     
    fclose(fp);
    
    return fileContent;
}


int main ( void )
{
    char *serverConfContent;
    serverConfContent = readFile("server.conf");
    
    char *htmlContent = readFile(serverConfContent);

}

2. server.conf内容

index.html

3. index.html内容

<html><head><p>This is an example paragraph.</p></html>

问题根源

  1. 路径包含多余换行符:fgets()读取server.conf时,会把文件末尾的换行符\n一并读入返回内容,导致serverConfContent实际值为"index.html\n"。系统找不到名为index.html\n的文件,因此fopen()返回空指针。
  2. 无效内存分配:FILE* fp = malloc(MAX_BUFFER);属于错误操作,文件指针无需手动分配内存,该代码会造成内存泄漏。
  3. 空指针未拦截:当fopen()返回空指针时,后续仍执行fgets()和fclose(),会触发未定义行为。

修复代码

#include <string.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define MAX_BUFFER      1024


char *readFile(char *filePath){
    FILE* fp = fopen(filePath, "r");  
    printf("filepath is: %s\n", filePath);
    printf("pointer is: %p\n", fp);

    if (NULL == fp) {
        printf("file can't be opened \n");
        return NULL;
    }
    
    char* fileContent = malloc(MAX_BUFFER);
    if (fileContent == NULL) {
        printf("malloc failed\n");
        fclose(fp);
        return NULL;
    }
    
    if (fgets(fileContent, MAX_BUFFER, fp) != NULL) {
        // 移除换行符
        fileContent[strcspn(fileContent, "\n")] = '\0';
        printf("content of fileContent in readFile: %s\n", fileContent);
    } else {
        fileContent[0] = '\0';
    }
     
    fclose(fp);
    return fileContent;
}


int main ( void )
{
    char *serverConfContent = readFile("server.conf");
    if (serverConfContent != NULL) {
        char *htmlContent = readFile(serverConfContent);
        // 释放内存避免泄漏
        free(htmlContent);
        free(serverConfContent);
    }
}

修复说明

  • 移除FILE* fp的无效malloc操作,消除内存泄漏风险。
  • 用strcspn()剔除fgets()读取到的换行符,确保返回的路径为纯文件名。
  • 增加空指针检查逻辑,包括malloc失败和fopen失败的场景,避免非法内存访问。
  • 主函数中添加内存释放操作,完善内存管理。

内容的提问来源于stack exchange,提问作者OcR19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:54:18