【问题标题】:Reading binary file C++读取二进制文件 C++
【发布时间】:2013-02-15 06:32:17
【问题描述】:

请帮帮我。我无法读取二进制文件。该文件的长度是198944,但我的代码读取374。我尝试使用fread、ifstream、WinAPI ReadFile。 这是读取文件的函数:

std::string ReadThisFile(std::string aPath) {
   FILE *inputstream = fopen(aPath.c_str(),"rb");
   long size;
   size_t result; 
   fseek(inputstream,0,SEEK_END); 
   size = ftell(inputstream); 
   rewind(inputstream); 
   char *buff = new char [size];
   result = fread (buff,1,size,inputstream); 
   std::string ret=buff; 
   fclose(inputstream); 
   delete[]buff; 
   return ret; 
}

File sample

需要任何帮助,谢谢!

【问题讨论】:

  • 您是否使用strlen 来获得最终尺寸?您不能将二进制内容存储在字符串中。
  • 该文件是否应该是您想要加载到单个std::string 中的 ASCII 文本文件?如果没有,请使用其他容器。 (比如std::vector<unsigned char> 或类似的东西)。
  • 顺便说一句,fseek(binary_stream, offset, SEEK_END) 不能保证工作(根据 1999 年的 C 标准)。

标签: c++ fread


【解决方案1】:

只要您知道您返回的 std::string 包含二进制数据,请替换

std::string ret=buff;

std::string ret(buff, size);

【讨论】:

    【解决方案2】:

    您不能将二进制数据放在字符串中。请记住,字符串由特殊字符 '\0' 终止,它与值零相同。如果二进制数据中包含零,则与字符串结尾相同。

    您可能应该使用std::vector<int8_t> 来存储二进制数据。

    【讨论】:

    • 谢谢。是的,那是我的问题。
    【解决方案3】:

    问题出在这里:

    std::string ret = buff;
    

    根据this,它:

    "复制s指向的null-terminated字符序列(C-string)。"

    所以一旦到达0x00 字符就会停止。

    如果您要返回 buff(这是一种危险的做法)或让您的函数将 char 数组作为输入参数并将其存储在那里,它应该可以工作。你可能想要返回一个长度指示符,否则 C++ 将不知道数组有多大。

    【讨论】:

    • 谢谢。是的,那是我的问题。
    猜你喜欢
    • 2017-10-01
    • 2011-09-03
    • 2016-01-15
    • 2011-02-03
    • 2015-08-22
    • 2012-08-19
    • 2011-10-20
    • 2013-07-24
    • 2019-05-16
    相关资源
    最近更新 更多