【问题标题】:segmentation fault with char* buffer in getline() functiongetline() 函数中 char* 缓冲区的分段错误
【发布时间】:2022-01-02 13:04:11
【问题描述】:

我在下面的代码中得到分段文件。 原因在第 10 行,我猜我在哪里使用 char* 缓冲区。 我想知道这是为什么。

是不是因为缓冲区中的内存还没有分配?

代码如下:

  1 #include <iostream>
  2 #include <fstream>
  3
  4 int main()
  5 {
  6     const char* filename = "directory of my file";// mnt/c/Users/...
  7     std::fstream fin(filename,std::fstream::in);
  8     if(!fin.is_open())
  9         std::cout << "Opps!" << std::endl;
 10     char* buffer = NULL;//if char buffer[100] then it will be good.
 11     while(!fin.eof())
 12     {
 13         fin.getline(buffer,100);
 14         std::cout << buffer << std::endl;
 15     }
 16     return 0;
 17 }

【问题讨论】:

标签: c++ segmentation-fault getline


【解决方案1】:

是不是因为缓冲区中的内存还没有分配?

是的。事实上,您甚至没有 缓冲区。指针buffer 为NULL,这意味着它指向您没有业务访问的内存位置。然后您继续告诉getline(),它可以从该地址开始最多写入 100 个字节。

当您使用 char buffer[100] 时它起作用了,因为这是一个分配在堆栈上的数组,大到足以容纳您承诺 getline() 可以写入的 100 个字节的上限。

如果您事先不知道行的长度并希望能够处理任意长度,请考虑改用std::string。以下是在 C++ 中逐行读取文件的典型方法:

std::string line;
while (std::getline(fin, line))
{
    std::cout << line << "\n";
}

另请阅读:Why is iostream::eof inside a loop condition considered wrong?

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多