如何在多个块中读取文件,直到EOF(C++)

jnd*_*dok 6 c++ file

所以,这是我的问题:我想创建一个从文件中读取数据块的程序.比方说,每个块有1024个字节.所以我读取了前1024个字节,执行各种操作,然后打开下一个1024字节,而不读取旧数据.该程序应该保持读取数据不会达到EOF.

我目前正在使用此代码:

std::fstream fin("C:\\file.txt");

vector<char> buffer (1024,0); //reads only the first 1024 bytes
fin.read(&buffer[0], buffer.size());
Run Code Online (Sandbox Code Playgroud)

但是如何读取下一个1024字节?我正在考虑使用for循环,但我真的不知道如何.我完全是C++中的菜鸟,所以如果有人能帮助我,那就太棒了.谢谢!

111*_*111 8

你可以用循环来做到这一点:

std::ifstream fin("C:\\file.txt", std::ifstream::binary);
std::vector<char> buffer (1024,0); //reads only the first 1024 bytes

while(fin.read(buffer.data(), buffer.size())) {
    std::streamsize s=fin.gcount();
    ///do with buffer
}
Run Code Online (Sandbox Code Playgroud)

EDITED

http://en.cppreference.com/w/cpp/io/basic_istream/read

  • 此解决方案不会读取最后一块文件. (13认同)
  • 应该是,while(!fin.eof()){fin.read(buffer.data(),buffer.size()); std :: streamsize dataSize = fin.gcount(); } (4认同)
  • 这是危险的代码 - 您应该继续 `while(fin.good())`,因为仅当到达文件末尾时才设置 `eof`;如果出现错误,您的循环将永远继续下去。如果文件结尾或设置了“badbit”,“good”将变为 false。另外,您应该在循环完成后测试“if (fin.bad())”,看看是否有任何问题。 (4认同)

Mat*_*szL 5

接受的答案对我不起作用-它不会读取最后的部分块。这样做:

void readFile(std::istream &input, UncompressedHandler &handler) {
    std::vector<char> buffer (1024,0); //reads only 1024 bytes at a time
    while (!input.eof()) {
        input.read(buffer.data(), buffer.size());
        std::streamsize dataSize = input.gcount();
        handler({buffer.begin(), buffer.begin() + dataSize});
    }
}
Run Code Online (Sandbox Code Playgroud)

这里UncompressedHandler接受std :: string,所以我使用来自两个迭代器的构造函数。