[英]Segmentation fault in reading a file and writing it to a char vector
以下是我編寫的用於讀取文件並將其存儲在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;
}
代碼可以編譯,但是由於我不清楚的原因,我遇到了段錯誤。 誰能幫我解決為什么出現段錯誤?
您對std::vector<char>
需要更新。
您尚未在std::vector
分配任何內存來容納任何項目。
您正在使用buffer
,就好像它是指向char
數組的指針一樣。
refFile->read((((char*)(buffer))+pos),WIDTH);
如上所述,將類型轉換buffer
鍵入char*
會導致未定義的行為。
可以通過讀取一次一個字符,並將它們添加到解決問題poth std::vector
,或讀取字符的陣列,並且將它們添加到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&
而不是ifstream*
傳遞給read_file
。
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.