繁体   English   中英

读取文件并将其写入char向量时出现分段错误

[英]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>需要更新。

  1. 您尚未在std::vector分配任何内存来容纳任何项目。

  2. 您正在使用buffer ,就好像它是指向char数组的指针一样。

      refFile->read((((char*)(buffer))+pos),WIDTH); 

    如上所述,将类型转换buffer键入char*会导致未定义的行为。

可以通过读取一次一个字符,并将它们添加到解决问题poth std::vector ,或读取字符的阵列,并且将它们添加到std::vector一次一个字符。

  1. 第一种方法。

     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; } 
  2. 第二种方法。

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM