为什么ifstream阅读器只读取图像文件的前10个字节?

时间:2015-11-01 07:11:36

标签: c++ file-io binaryfiles ifstream

以下是我正在尝试的代码:

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的字符,因此我的长度和字符串只变小部分了?

任何想法真正发生的事情以及如何解决它?

1 个答案:

答案 0 :(得分:2)

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

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

相反,你应该这样做:

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

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

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