读取文件并将其写入字符向量时出现分段错误
Segmentation fault in reading a file and writing it to a char vector
以下是我编写的代码,用于读取文件并将其存储在字符向量中。
#include <fstream>
#include "Graph.hpp"
#include <iostream>
using std::ifstream;
using std::vector;
using std::string;
using std::cout;
using std::endl;
static int const WIDTH = 50;
vector<char>* read_file(ifstream*);
int main(){
ifstream file;
vector<char>* buf;
file.open("myfile");
if(file.is_open()){
buf = read_file(&file);
}
// Graph graphObj;
// graphObj.populateGraph(buffer);
}
vector<char>* read_file(ifstream* refFile){
vector<char>* buffer = new vector<char>();
int pos = 0;
while(!(refFile->eof())){
refFile->read((((char*)(buffer))+pos),WIDTH);
pos += WIDTH; // update the pos with the number of characters read earlier
}
return buffer;
}
代码编译,但由于我不清楚的原因,我遇到了分段错误。谁能帮我为什么会出现赛格故障?
您需要更新对std::vector<char>
的处理。
-
您尚未在
std::vector
中分配任何内存来保存任何项目。 -
您正在使用
buffer
,就好像它是指向char
数组的指针一样。refFile->read((((char*)(buffer))+pos),WIDTH);
如上所述,类型强制转换
buffer
char*
是导致未定义行为的原因。
您可以通过一次读取一个字符并将它们添加到std::vector
,或者读取字符数组并将它们一次添加到一个字符std::vector
来解决 poth 问题。
-
第一种方法。
vector<char>* read_file(ifstream* refFile){ vector<char>* buffer = new vector<char>(); int pos = 0; int c; while( (c = refFile->get()) != EOF ){ buffer->push_back(static_cast<char>(c)); } return buffer; }
-
第二种方法。
vector<char>* read_file(ifstream* refFile){ vector<char>* buffer = new vector<char>(); char temp[WIDTH]; while( (refFile->read(temp, WIDTH))){ std::streamsize count = refFile->gcount(); for (std::streamsize i = 0; i < count; ++i ) { buffer->push_back(temp[i]); } } return buffer; }
我看不出您有任何理由从堆中创建std::vector
而不是在堆栈上创建它并返回对象而不是指针。您正在增加代码的复杂性,却没有太多好处。
此外,您应该将ifstream&
传递给read_file
而不是ifstream*
。
vector<char> read_file(ifstream& refFile){
vector<char> buffer;
int pos = 0;
int c;
while( (c = refFile.get()) != EOF ){
bufferpush_back(static_cast<char>(c));
}
return buffer;
}
int main(){
ifstream file;
vector<char> buf;
file.open("myfile");
if(file.is_open()){
buf = read_file(file);
}
}
现在,您不必担心delete
buf
。
相关文章:
- C++中函数的向量返回类型引发错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 对象指针 c++ 的全局向量错误
- C++:自定义数据类型向量错误的队列
- getCompatibleComponent返回向量错误
- FlatBuffers:未支撑的工会向量错误将JSON文件转换为二进制文件
- 尝试调用 at() 时 c++ 中的向量错误
- 结果向量错误
- 尝试用函数填充线程向量 - 错误
- C++ 布尔向量错误:赋值时"iterator not dereferencable"
- CUDA 推力:类的:d向量 |错误
- C++多结构向量错误
- c++正则化向量;错误:无法绑定
- c++向量错误
- 向量错误抛掷分配经验甚至不访问任何元素
- std::函数的向量错误
- STL向量错误:未知类型名称
- 向量错误分配错误 C++