C++ 如何在EOF(C+;+;)之前读取多个块中的文件
所以,我的问题是:我想制作一个程序,从文件中读取数据块。比如说,每个块1024字节。 因此,我读取前1024个字节,执行各种操作,然后打开下一个1024个字节,而不读取旧数据。程序应一直读取数据,直到达到EOF 我目前正在使用以下代码:C++ 如何在EOF(C+;+;)之前读取多个块中的文件,c++,file,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], b
std::fstream fin("C:\\file.txt");
vector<char> buffer (1024,0); //reads only the first 1024 bytes
fin.read(&buffer[0], buffer.size());
std::fstream-fin(“C:\\file.txt”);
向量缓冲区(1024,0)//仅读取前1024个字节
fin.read(&buffer[0],buffer.size());
但是我如何读取接下来的1024字节呢?我在考虑使用for循环,但我真的不知道如何使用。我完全是C++的NoOB,所以如果有人能帮助我,那就太好了。谢谢 您可以通过循环执行此操作:
std::ifstream fin("C:\\file.txt", std::ifstream::binary);
std::vector<char> buffer (1024,0); //reads only the first 1024 bytes
while(!fin.eof()) {
fin.read(buffer.data(), buffer.size())
std::streamsize s=fin.gcount();
///do with buffer
}
std::ifstream-fin(“C:\\file.txt”,std::ifstream::binary);
std::向量缓冲区(1024,0)//仅读取前1024个字节
而(!fin.eof()){
fin.read(buffer.data(),buffer.size())
std::streamsize s=fin.gcount();
///与缓冲区有关吗
}
##编辑
我认为您错过了文件中有一个指针指向您最后访问的位置,因此当您第二次阅读时,您不会从第一次开始,而是从您最后访问的位置开始。 看看这个代码
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
所以你们可能会这样想这个概念。接受的答案对我不适用-它不读最后一部分。这是:
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});
}
}
void readFile(std::istream&input、解压handler&handler){
std::vector buffer(1024,0);//一次只读取1024字节
而(!input.eof()){
input.read(buffer.data(),buffer.size());
std::streamsize dataSize=input.gcount();
处理程序({buffer.begin(),buffer.begin()+dataSize});
}
}
这里UncompressedHandler接受std::string,所以我使用来自两个迭代器的构造函数。是的,循环是最好的选择。另外,您应该使用
fin.gcount()
来确定实际读取了多少数据。此外,如果你只是在阅读,你应该使用std::ifstream
(如果你想阅读二进制数据而不是文本,你应该使用std::ios_base::binary
)打开文件。@DietmarKühl为什么不使用rdbuf
?@user2485710:对于初学者来说,正确使用它太难了。即使是有经验的用户也很少关注std::istream::sentry
@user2485710,因为大多数人不想仅仅为了读取bin文件就必须清理iostreams文档。这真的有效吗?根据文档,“read”返回*this.It应该是,而(!fin.eof()){fin.read(buffer.data(),buffer.size());std::streamsize dataSize=fin.gcount();}因为在最后一次(非完全)读取时,istream变为eof,因此计算结果为false,在我现在得到它时不输入。谢谢对于其他情况,请检查的返回值(返回流本身*this
)及其bool重载方法。(1)如果fail()返回true,则返回空指针。当流到达其末端时,fail()
返回true
。