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

时间:2014-01-03 19:48:54

标签: 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());

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

4 个答案:

答案 0 :(得分:9)

您可以通过循环执行此操作:

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
}

EDITED

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

答案 1 :(得分:1)

我想你错过了有一个指针指向你在文件中访问的最后一个位置,所以当你第二次阅读时,你不会从第一个开始,而是从最后一个点开始你'访问。 看看这段代码

std::ifstream fin("C:\\file.txt");
char buffer[1024]; //I prefer array more than vector for such implementation

fin.read(buffer,sizeof(buffer));//first read get the first 1024 byte

fin.read(buffer,sizeof(buffer));//second read get the second 1024 byte

以便你如何思考这个概念。

答案 2 :(得分:1)

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

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});
    }
}

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

答案 3 :(得分:0)

我认为这会奏效

# A tibble: 6 x 6
  country continent  year lifeExp       pop gdpPercap
  <fct>   <fct>     <int>   <dbl>     <int>     <dbl>
1 China   Asia       1952    44   556263527      400.
2 China   Asia       1957    50.5 637408000      576.
3 China   Asia       1962    44.5 665770000      488.
4 China   Asia       1967    58.4 754550000      613.
5 China   Asia       1972    63.1 862030000      677.
6 China   Asia       1977    64.0 943455000      741.