我是否必须在每次使用 ifstream 读取后寻找

Do I have to seek after each read using ifstream?

本文关键字:ifstream 读取 寻找 是否      更新时间:2023-10-16

这是我从任何大小的文件读取的循环,每次写入 1016 字节的 char* 数据包,然后发送它(发送尚未包含)。

seekg() 有必要吗?还是阅读已经将指针移到下一个块的前面?

ifstream file (packet.message, ios::in|ios::binary|ios::ate);
if(file.is_open()) {
    size = file.tellg();
    file.seekg(0, ios::beg);
    for(int i = 0; !ios::eof; i++) {
        memset(packet.message,0,1016*sizeof(char));
        file.read(packet.message,1016*sizeof(char));
        file.seekg(i*1016*sizeof(char));
    }
}

我知道这不是写入文件的问题,因为您只需一直写入到最后,直到文件大小合适。

编辑:在 if 语句中添加了整段代码。

没有必要

。从上次看到文件指针的位置继续读取,与写入完全相同。

我敢打赌,该文件没有以std::ios_base::binary模式打开,并且memset()seekg()都用于掩盖结果效果:两者都不需要,尽管如果文件读取部分记录,您可能需要清除文件末尾的尾随字节。

顺便说一句:您总是想在阅读检查流的状态:

while (in.read(buffer, size)) {
    ...
}

另外: sizeof(char) == 1 .