为什么 ifstream reader 只读取图像文件的前 10 个字节?
Why ifstream reader read only first 10 bytes of an image file?
这是我正在尝试使用的代码:
ifstream fileReader("server_data\test2.jpg", ios::in | ios::binary);
char buffer[RESP_LENGTH];
memset(buffer, '[=11=]', RESP_LENGTH);
if (fileReader.is_open())
{
fileReader.seekg(0);
fileReader.read(buffer, RESP_LENGTH);
cout << buffer<<endl<<"Length: "<<strlen(buffer);
}
fileReader.close();
它只是读取前几个字节。它也因文件而异。
我怀疑,可能它得到一个评估为 NULL 的字符,因此我的长度和字符串只得到一小部分?
知道真正发生了什么以及如何解决它吗?
问题不在于您阅读的方式,而在于您打印的方式。
如果有 [=11=]
个字符,则表示 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)。但我猜你的目标不是打印二进制内容。
这是我正在尝试使用的代码:
ifstream fileReader("server_data\test2.jpg", ios::in | ios::binary);
char buffer[RESP_LENGTH];
memset(buffer, '[=11=]', RESP_LENGTH);
if (fileReader.is_open())
{
fileReader.seekg(0);
fileReader.read(buffer, RESP_LENGTH);
cout << buffer<<endl<<"Length: "<<strlen(buffer);
}
fileReader.close();
它只是读取前几个字节。它也因文件而异。
我怀疑,可能它得到一个评估为 NULL 的字符,因此我的长度和字符串只得到一小部分?
知道真正发生了什么以及如何解决它吗?
问题不在于您阅读的方式,而在于您打印的方式。
如果有 [=11=]
个字符,则表示 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)。但我猜你的目标不是打印二进制内容。