以下是我正在尝试的代码:
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的字符,因此我的长度和字符串只变小部分了?
任何想法真正发生的事情以及如何解决它?
答案 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)。但我想你的目标不是打印那个二进制内容。