所以,这就是我的问题:我想制作一个从文件中读取数据块的程序。比方说,每个块有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 ++中完全是一个菜鸟,所以如果有人能帮助我,那就太棒了。谢谢!
答案 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
}
答案 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.