以下是我编写的用于读取文件并将其存储在char矢量中的代码。
#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;
}
代码编译,但由于我不清楚的原因,我收到了分段错误。任何人都可以帮助我解决为什么我会遇到段故障?
答案 0 :(得分:2)
您需要更新std::vector<char>
的处理。
您尚未在std::vector
中分配任何内存以容纳任何内容。
您正在使用buffer
,因为它是指向char
s数组的指针。
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
。