gpt4 book ai didi

c++ - readsome() 是否适合在 Windows 上读取二进制数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:12 26 4
gpt4 key购买 nike

上下文:我正在尝试用 C++ 读取 PNG 图片的内容,以便稍后将其发送到我的 Android 应用程序。为此,我以二进制模式打开文件,按 512 字节的 block 读取它的内容,然后将数据发送到应用程序。我在 Windows 上。

问题:我使用 ifstream 实例和 readsome() 函数,如下所示,它返回 512,这就是我期望因为我要求读取 512 个字节。但是,我的缓冲区似乎远未真正拥有 512 个字节,这让我感到困惑。当我一步一步地调试我的程序时,缓冲区中的字符数似乎是随机的,但从来没有像预期的那样是 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 相关的问题导致此行为?有没有更合适的方式进行?

最佳答案

我终于找到了一种方法来做我想做的事,按照 David Herring 的建议,我将把我的答案放在这里。

我对这个问题的想法:如果我使用 std::ifstream::pos_type 变量而不是 int,正确的数字字节数被读取并放入缓冲区。使用 int 时情况并非如此,就好像字符只写入缓冲区直到给定(随机?)点。我不确定为什么会发生这种行为。我的猜测是我遇到了 '\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();

我希望这对其他人有帮助。谢谢大卫的建议。

关于c++ - readsome() 是否适合在 Windows 上读取二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com