代码之家  ›  专栏  ›  技术社区  ›  HAL9000

从二进制文件读取到char*缓冲区时访问violaton

c++
  •  0
  • HAL9000  · 技术社区  · 5 年前

    我用ofstream编写了一个二进制文件,从一个float数组开始。 当我用notepad++打开它时,我看到一行ascii符号。 文件资源管理器中显示的大小为19922944字节。

    现在我试着用ifstream阅读它:

    size_t fileSize = sizeof(char)*19922944; // this value is coherent with the original buffer size and it's the same exact size that I can see from File Explorer
    char *fileBuffer = new char(lSize);
    std::ifstream iFile("C:\\TheFile.dat", std::ios::in | std::ios::binary);
    iFile.read( fileBuffer, fileSize); // 0xC0000005 Access violation writing location 
    iFile.close();
    

    相反,如果我读到一个更小的大小,比如filesize=2000,那么它工作得很好。 但是,同样,磁盘上的大小是19922944。 你知道会出什么事吗?

    2 回复  |  直到 5 年前
        1
  •  6
  •   R Sahu    5 年前
    char *fileBuffer = new char(lSize);
    

    是错误的。它只为一个分配内存 char . 你需要使用

    char *fileBuffer = new char[lSize];
    

    最好使用 std::string 所以你的代码不必担心内存管理。

    std::string fileBuffer(lSize, ' ');
    iFile.read(fileBuffer.data(), fileSize);
    
        2
  •  2
  •   Sid S    5 年前

    假设你的意思是 char *fileBuffer = new char(fileSize); 您正在分配单个字符并使用一个太大而无法存储在单个字符中的值初始化它。

    如果启用编译器的警告,则可能会提醒您此类问题。

    例如,MSVC 2015表示:

    warning C4267: 'initializing': conversion from 'size_t' to 'char', possible loss of data