将文件的未知部分读取到矢量
Read unknown part of file to vector
我想打开一个文件,读取前 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>::resize
和std::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;
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中