C++ 将文件的未知部分读取到向量
我想打开一个文件,读取前5个字节,检查前4个字节是否与给定的签名匹配,第5个字节是我的文件头的大小。标题的大小是我下一步阅读以获取其余数据的构建时感到意外的内容 到目前为止,我尝试的是:C++ 将文件的未知部分读取到向量,c++,C++,我想打开一个文件,读取前5个字节,检查前4个字节是否与给定的签名匹配,第5个字节是我的文件头的大小。标题的大小是我下一步阅读以获取其余数据的构建时感到意外的内容 到目前为止,我尝试的是: #include <iostream> #include <fstream> #include <vector> #include <string> typedef struct file_header{ char signature[4]; u
#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++中,你不能制作动态数组,因此矢量。
我能做些什么来获得我需要的输出
我写的代码给出了一个超出范围的向量,我猜[0]会这样做吗
收到的任何帮助或指针。您应该执行
vector\u data.resize(header.size)
,因为reserve
,只保留内存,这并不意味着该向量包含有效对象(因此您无法访问任何内容)
看看std::vector::resize
和std::vector::reserve
之间的区别
另外,您正在为
char*
类型的header.size
元素分配内存,但所有元素都未初始化,因此当您尝试读取其中一个元素时,您将无处读取,这将导致分段错误。首先用新字符[some_size]
为每个指针分配内存你应该做向量数据.resize(header.size)
,因为reserve
只保留内存,这并不意味着这个向量包含有效对象(所以你不能访问任何东西)
看看std::vector::resize
和std::vector::reserve
之间的区别
另外,您正在为char*
类型的header.size
元素分配内存,但所有元素都未初始化,因此当您尝试读取其中一个元素时,您将无处读取,这将导致分段错误。首先使用新字符[某些大小]
为每个指针分配内存读取标头后,文件指针的位置将准备好读取其后面的字节<代码>财务seekg(0,标准::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\u data
的内存
delete[] header_data;
一旦您读取了头,文件指针的位置就准备好读取它后面的字节<代码>财务seekg(0,标准::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\u data
的内存
delete[] header_data;
将向量声明更改为:
std::vector header\u data代码>要调整大小的保留和我的读取行:fIn.read(&header\u data[0],(int)header.size)代码>成功了!谢谢将向量声明更改为:std::vector header\u data代码>要调整大小的保留和我的读取行:fIn.read(&header\u data[0],(int)header.size)代码>成功了!谢谢