表示以0x00作为字符串的文件

时间:2013-08-17 05:36:17

标签: c++ file

我想将我的文件表示为一个字符串,但我有一个问题,该文件包含一个0x00,我的字符串在那里被终止。如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果您不能使用null作为终止字符,则几乎没有选项:

a)在字符串之前写入字符串大小:      005Hello      011Hello \ 0World

b)使用固定长度的字符串

c)使用类似'\'的特殊字符前缀非终止空值。如果字符串中出现“\”,请将其写入“\”两次。阅读时反转逻辑。

答案 1 :(得分:1)

我在二进制文件0x61中有一个这样的txt文件0x61 0x61 0x00 0x62 0x62 0x62

二进制文件中的“txt文件”? - 我不知道它是什么意思。

但是,如果您使用空格分隔值,则可以尝试使用std::vector std::string (不使用空终止)

std::ifstream fin("input.txt");

 std::vector<std::string> v;
 std::copy(std::istream_iterator<std::string> (fin),
           std::istream_iterator<std::string> (), 
           std::back_inserter(v) );

std::vector<std::string>::iterator it =v.begin();

for(;it!=v.end();++it)                       
  std::cout<< *it<<" ";

答案 2 :(得分:0)

请务必以二进制模式读取文件:

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

std::string read_file_as_string(const char* filename) {
  std::ifstream input(filename, std::ios::binary);
  if (!input) {
    std::perror("Great failure");
    std::exit(1);
  }

  std::stringstream contents;
  contents << input.rdbuf();
  return contents.str();
}

int main() {
  std::string s = read_file_as_string("Derp.exe");
  std::cout << "s.size() = " << s.size() << '\n';
  for(unsigned char c : s) {
    std::cout << std::hex << static_cast<unsigned int>(c) << ' ';
  }
  std::cout << '\n';
}