c++ - 读取文件并将其写入字符 vector 时出现段错误

标签 c++ file vector

以下是我编写的读取文件并将其存储在字符 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> 的处理需要更新。

  1. 您还没有在 std::vector 中分配任何内存以容纳任何元素。

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

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

    类型类型转换 bufferchar* ,正如您在上面所做的那样,是导致未定义行为的原因。

您可以通过一次读取一个字符并将它们添加到 std::vector 来解决 poth 问题。 ,或者读取一个字符数组并将它们添加到 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&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/

相关文章:

c++ - 提高SDL的逐像素访问速度

c++ - 使用 reference_wrapper 作为 condition_variable 谓词

创建具有定义大小的文件

c++ - 为 vector 的 vector 提供平坦迭代器的优雅方式

C++ 编译型资源所有者断言

c++ - 访问成员变量时的性能注意事项

支持通配符的 Python Windows 文件复制

python - 从 Django 中的表单字段获取文件

c++ - 从二维 vector 中分解出一个 vector

c++ - 为什么我的 vector 迭代器不兼容?