上下文:我正在尝试读取C ++中PNG图片的内容,以便稍后将其发送到我的Android应用。为此,我以二进制模式打开文件,以512字节的块读取文件的内容,然后将数据发送到应用程序。我在Windows上。
问题:我使用了一个 ifstream 实例和 readsome()函数,如下所示,它返回了512,这就是我期望,因为我要求读取512个字节。但是,似乎我的缓冲区中实际上还没有真正拥有512字节,这使我感到困惑。当我逐步调试程序时,缓冲区中的char数量似乎是随机的,但从未像预期的那样为512。
代码:
int currentByteRead = 0;
std::ifstream fl(imgPath.toStdString().c_str(), ios_base::binary);
fl.seekg( 0, std::ios::end );
int length = fl.tellg();
char *imgBytes = new char[512];
fl.seekg(0, std::ios::beg);
// Send the img content by blocks of 512 bytes
while(currentByteRead + 512 < length) {
int nbRead = fl.readsome(imgBytes, 512); // nbRead is always set to 512 here
if(fl.fail()) {
qDebug() << "Error when reading file content";
}
sendMessage(...);
currentByteRead += 512;
imgBytes = new char[512];
}
// Send the remaining data
int nbRemainingBytes = length - currentByteRead;
fl.readsome(imgBytes, nbRemainingBytes);
sendMessage(...);
fl.close();
currentByteRead += nbRemainingBytes;
我开始时得到的长度是正确的长度,似乎没有错误。但这似乎不是在 readsome()调用期间将所有数据都复制到了缓冲区中。
问题:我是否误解了有关 readsome()函数的内容?是否与Windows相关的某些原因导致此现象?有没有更合适的方式进行?
答案 0 :(得分:0)
我终于找到了一种实现自己想要的方式的方法,正如David Herring所建议的那样,我将在这里给出答案。
我对此问题的看法:如果我使用 std :: ifstream :: pos_type 变量而不是 int ,则正确的数字读取字节数并将其放入缓冲区。使用int时不是这种情况,就好像char只在缓冲区中写入直到给定(随机?)点一样。我不确定为什么会发生这种现象。我的猜测是我在使用'\ n'字符时遇到问题,但是缓冲区的最终内容的随机性对我来说仍然不清楚。
更正:尽管如此,这还是我终于找到的有效代码。从此开始,我能够做到我的构想。
std::ifstream ifs(imgPath.toStdString().c_str(), std::ios::binary|std::ios::ate);
std::ifstream::pos_type pos = ifs.tellg();
int length = ifs.tellg();
std::vector<char> result(pos);
ifs.seekg(0, std::ios::beg);
ifs.read(result.data(), pos);
ifs.close();
我希望这会帮助其他人。谢谢大卫的建议。