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

Segmentation fault in reading a file and writing it to a char vector

本文关键字:向量 错误 分段 字符 文件 读取      更新时间:2023-10-16

以下是我编写的代码,用于读取文件并将其存储在字符向量中。

#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* 是导致未定义行为的原因。

您可以通过一次读取一个字符并将它们添加到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;
    }
    

我看不出您有任何理由从堆中创建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