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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:15:05