【问题标题】:Why ifstream reader read only first 10 bytes of an image file?为什么 ifstream 阅读器只读取图像文件的前 10 个字节?
【发布时间】:2015-11-01 07:11:35
【问题描述】:

这是我正在尝试的代码:

ifstream fileReader("server_data\\test2.jpg", ios::in | ios::binary);
char buffer[RESP_LENGTH];
memset(buffer, '\0', RESP_LENGTH);
if (fileReader.is_open())
{
    fileReader.seekg(0);
    fileReader.read(buffer, RESP_LENGTH);
    cout << buffer<<endl<<"Length: "<<strlen(buffer);
}
fileReader.close();

它只是读取前几个字节。它也因文件而异。

我怀疑,可能它得到一个评估为 NULL 的字符,因此我的长度和字符串只占一小部分?

任何想法到底发生了什么以及如何解决它?

【问题讨论】:

  • 我无法判断 ifstream 仅从中读取几个字节。不要使用strlen 来测量二进制数据的长度。在这种情况下,istream::gcount 对于获取读取的长度很有用。

标签: c++ file-io binaryfiles ifstream


【解决方案1】:

问题不在于您阅读的方式,而在于您打印的方式。

如果有\0 字符,则表示end of string。因此字符串操作(如strlen 或打印到cout)将在该字符上停止(考虑到您的char* 中包含的string 在这里停止),但这并不意味着您的char* 数组不包含更多字符....

相反,您应该这样做:

cout << "Got " << fileReader.gcount() << "characters:";
for ( size_t i = 0; i != fileReader.gcount(); ++i )
    cout << buffer[i];

然后,您将打印您读取的所有字节,忽略 EOS 和其他特殊字符。

请注意,特殊字符将无法正确打印(请参阅this post)。但我猜你的目标不是打印二进制内容。

【讨论】:

  • 我会编辑它,让 OP 清楚地知道问题不在于读入,而在于打印出来。
  • 是的。做过某事。谢谢
  • @jpo38,谢谢。是的,所以,我明白了。我不关心打印它,但我会通过网络发送它。因此,在复制流时,我想我只需要使用带有缓冲区数组大小的“memcpy”来复制所有内容,而不管它包含哪些字符,对吧?
  • 没错,用gcount知道你要复制多少字节……然后你就可以接受答案了;-)
  • ostream::write 可能有用。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2021-06-30
相关资源
最近更新 更多