【问题标题】:How to read a string from a binary file?如何从二进制文件中读取字符串?
【发布时间】:2020-10-30 11:20:27
【问题描述】:

我正在尝试从二进制文件中读取字符串(ver)。字符串中的字符数(numc)也是从文件中读取的。这就是我读取文件的方式:

 uint32_t numc;
 inFile.read((char*)&numc, sizeof(numc));
 char* ver = new char[numc];
 inFile.read(ver, numc);
 cout << "the version is: " << ver << endl;

我得到的是我期望的字符串加上一些其他符号。我该如何解决这个问题?

【问题讨论】:

  • 它在文件中不是空终止的。您需要将它存储在一个长度感知的字符串存储中,例如 std::string,或者自己提供空字符。另见stackoverflow.com/questions/27061489/…
  • 感谢@Kenny Ostrom 的回复

标签: c++ string binary


【解决方案1】:

char* 字符串是 nul 终止 字符序列。您的代码忽略了 nul 终止部分。这是它的外观

uint32_t numc;
inFile.read((char*)&numc, sizeof(numc));
char* ver = new char[numc + 1]; // allocate one extra character for the nul terminator
inFile.read(ver, numc);
ver[numc] = '\0'; // add the nul terminator
cout << "the version is: " << ver << endl;

还有sizeof(numc) 不是size(numc),虽然这可能是一个错字。

【讨论】:

  • 如果这对您不起作用,请确保 numcendian 与文件的字节序匹配
  • 你是对的。我忘记了空字符。问题已经解决了。谢谢。
  • 用完后别忘了delete[] ver。最好改用std::string,或者至少使用std::unique_ptr&lt;char[]&gt;
  • @RemyLebeau 我不明白为什么会有问题?
  • @MahshadJavidan 内存泄漏与无内存泄漏。无论您使用new 分配什么,您都必须deletestd::unique_ptr 将为您处理。使用std::string,您完全不必担心这一点。
猜你喜欢
  • 2014-06-18
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多