getline()函数中的char*缓冲区存在分段错误

segmentation fault with char* buffer in getline() function

本文关键字:缓冲区 存在 分段 错误 char 函数 getline      更新时间:2024-05-09

我在下面的代码中得到了分段文件。原因是在第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 }

是因为缓冲区中的内存尚未分配吗?

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

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

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

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

另请阅读:为什么循环条件中的iostream::eof被认为是错误的?