调用GetOpenFileName()选中用户文件后无法打开的问题咨询
程序加载文件失败的原因及修复方案
问题原因汇总
- 最核心的致命错误:
display_file函数中调用fopen时传入的是字符串常量"path",而非函数入参path变量,导致程序永远尝试打开名为path的文件,而非用户选择的目标文件。 GetOpenFileName没有做返回值判断:如果用户点击选择文件窗口的「取消」按钮,该函数会返回FALSE,此时路径为空直接传入读文件逻辑会触发异常。- 路径缓冲区长度不足:
open_file中存储路径的Filename数组仅定义了100字节,Windows下深层嵌套的文件路径很容易超出该长度,导致路径截断无法匹配到真实文件。 - 文件读取逻辑完全错误:
- 用
fscanf+%s读取文件内容,每次读取会覆盖filecontent数组,最终仅能保留文件的最后一个空白分隔的字符串,无法拿到完整文件内容 while(!feof(file))用法错误,feof仅在读操作失败后才会置位,会导致最后一次读取逻辑重复执行- 无缓冲区边界检查,文件内容过长会触发栈溢出
- 用
- 资源泄漏:文件打开后没有调用
fclose关闭文件句柄,多次调用后会因为进程打开文件数超限无法再打开新文件 - 未初始化风险:
filecontent数组未初始化,文件打开失败时直接传给printf和SetWindowText会输出乱码甚至触发崩溃
修复后的参考代码
#include <windows.h> #include <stdio.h> #include <string.h> // 全局变量hdisplay请根据你的实际代码调整作用域 HWND hdisplay; void display_file(char *path) { FILE *file; // 扩大缓冲区,也可以动态获取文件大小分配内存 char filecontent[4096] = {0}; // 初始化避免乱码 printf("path %s\n", path); // 传入path变量而非字符串常量 if ((file = fopen(path, "r")) == NULL) { printf("cant open this file.\n"); strcpy(filecontent, "无法打开指定文件"); } else { size_t read_len = fread(filecontent, 1, sizeof(filecontent) - 1, file); filecontent[read_len] = '\0'; // 手动加字符串结束符 fclose(file); // 关闭文件句柄 } printf("%s", filecontent); SetWindowText(hdisplay, filecontent); } void open_file(HWND hWnd) { OPENFILENAME ofn; // 扩大路径缓冲区到MAX_PATH(Windows默认最大路径长度常量) char Filename[MAX_PATH] = {0}; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFile = Filename; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = "Text Files\0*.txt\0All Files\0*.*\0" ; // 补充过滤器结束符 ofn.nFilterIndex = 1; // 判断用户是否确实选择了文件 if (GetOpenFileName(&ofn)) { display_file(ofn.lpstrFile); } }
内容的提问来源于stack exchange,提问作者dario3004
相关产品推荐
相关产品推荐

