使用std::fgetc读取文件赋值时触发0xC0000005错误如何解决?
错误原因
- 向量越界访问:你声明的
std::vector<std::string> ID是空向量,没有预先分配任何存储空间。ID[4]写法本身属于非法越界访问,后续循环中ID[i]赋值操作也不会触发向量自动扩容,直接写入未申请的内存地址,就是触发0xC0000005访问违规错误的核心原因。 - 类型使用错误:
fgetc返回值为int类型(正常读取时返回字符对应的unsigned char转int的值,读取失败返回EOF),你直接将int值赋值给std::string类型的向量元素,逻辑完全错误;且你仅需要存储4个char字符,不需要使用std::vector<std::string>这种嵌套字符串的冗余结构。 - 缺少文件打开校验:你没有判断
fopen的返回值,如果目标文件路径错误、权限不足导致打开失败,WAVF会是NULL指针,后续fgetc调用也会触发内存访问错误。
正确实现
如果只需要存储前4个字符,推荐用std::vector<char>或std::string直接存储,示例代码如下:
#include <cstdio> #include <vector> #include <cassert> // 替换为实际的文件路径变量 const char* FName = "test.awv"; FILE* WAVF = fopen(FName, "rb"); // 先校验文件是否打开成功 if (!WAVF) { // 此处可替换为你的自定义错误处理逻辑 assert(false && "文件打开失败"); } // 预先给vector分配4个char的存储空间 std::vector<char> ID(4); for (int i = 0; i < 4; i++) { int c = fgetc(WAVF); // 校验是否读取到文件末尾(文件不足4字节的场景) if (c == EOF) { assert(false && "文件长度不足4字节"); } ID[i] = static_cast<char>(c); } // 业务逻辑处理完后记得关闭文件句柄 fclose(WAVF);
如果需要将前4个字符直接拼成字符串使用,可以简化为如下写法:
std::string ID(4, '\0'); for (int i = 0; i < 4; i++) { int c = fgetc(WAVF); if (c == EOF) { assert(false && "文件长度不足4字节"); } ID[i] = static_cast<char>(c); }
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

