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

时间:2014-11-22 08:35:54

标签: c++ file 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;
}

代码编译,但由于我不清楚的原因,我收到了分段错误。任何人都可以帮助我解决为什么我会遇到段故障?

1 个答案:

答案 0 :(得分:2)

您需要更新std::vector<char>的处理。

  1. 您尚未在std::vector中分配任何内存以容纳任何内容。

  2. 您正在使用buffer,因为它是指向char s数组的指针。

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

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

  3. 您可以通过一次读取一个字符并将其添加到std::vector,或者读取一个字符数组并一次将它们添加到std::vector个字符来解决poth问题。

    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;
      }
      
    3. 我没有看到为什么要从堆创建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