将文件的未知部分读取到矢量

Read unknown part of file to vector

本文关键字:读取 文件 未知部      更新时间:2023-10-16

我想打开一个文件,读取前 5 个字节,检查前 4 个是否与给定的签名匹配,第 5 个是我的文件头的大小。标题的大小是我接下来要阅读的内容,以获取其余数据的构建。

到目前为止我尝试过:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
typedef struct file_header{
    char signature[4];
    unsigned char size;
    char version;
    //Different other things left out for example matters.
    unsigned int blocks;
    unsigned int block_size;
} header;
void open_file(std::string fileName, header &header){
    std::ifstream fIn;
    fIn.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    char buffer[5];
    try{
        fIn.open(fileName, std::ios::binary);
        //read the 1st 5 bytes to get header signature and header size
        fIn.read(buffer, 5);
        header.size = buffer[4];
        //Here my problems begins...
        fIn.seekg(0, std::ios::beg);
        std::vector<char*> header_data;
        header_data.reserve((int)header.size);
        //How do i read the first (int)header.size bytes of file to Vector?
        fIn.read(header_data[0], (int)header.size); //Wont work?
    }catch(std::ifstream::failure ex){
        std::cerr << ex.code().message() << std::endl;
        exit(0);
    }
}
int main(int argc, char* argv[]){
    char* filename = argv[1];
    file_header header;
    open_file(filename, header);
    return 0;
}

不久前我刚刚开始使用 c++,但在 Java 中,我可以做一些简洁的事情,例如:

char header_size[(int)header.size];

但到目前为止,我发现你不能用 c++ 制作动态数组,因此是向量。

我该怎么做才能获得所需的输出?

我编写的代码给出了一个超出范围的向量,我猜 [0] 这样做吗?

任何帮助或指示都已获得。.

你应该

vector_data.resize(header.size),因为reserve,只是保留内存,这并不意味着这个向量包含有效的对象(所以你不能访问任何东西)。

看看这个关于std::vector<T>::resizestd::vector<T>::reserve之间区别的SO问题。

此外,您正在为header.size类型的 char * 元素分配内存,但所有这些元素都未初始化,因此当您尝试读取其中一个元素时,您将无处读取,这将导致分段错误。首先使用 new char[some_size] 为每个指针分配内存。

读取标头后,文件指针已准备好读取其后面的字节。 fIn.seekg(0, std::ios::beg);会将文件指针移回您不希望的开头。

fIn.read(buffer, 5);
header.size = buffer[4];
char * header_data = new char[header.size];
fIn.read(header_data, (streamsize)header.size);
完成后

,您必须释放分配给header_data的内存

delete[] header_data;