调用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>
问题根源
- 路径包含多余换行符:
fgets()读取server.conf时,会把文件末尾的换行符\n一并读入返回内容,导致serverConfContent实际值为"index.html\n"。系统找不到名为index.html\n的文件,因此fopen()返回空指针。 - 无效内存分配:
FILE* fp = malloc(MAX_BUFFER);属于错误操作,文件指针无需手动分配内存,该代码会造成内存泄漏。 - 空指针未拦截:当
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
相关产品推荐
相关产品推荐

