Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在EOF(C+;+;)之前读取多个块中的文件_C++_File - Fatal编程技术网

C++ 如何在EOF(C+;+;)之前读取多个块中的文件

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

所以,我的问题是:我想制作一个程序,从文件中读取数据块。比如说,每个块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());
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