以下是我编写的读取文件并将其存储在字符 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
来解决 poth 问题。 ,或者读取一个字符数组并将它们添加到 std::vector
一次一个字符。
第一种方法。
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++ - 读取文件并将其写入字符 vector 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075554/