getline()函数中的char*缓冲区存在分段错误
segmentation fault with char* buffer in getline() function
我在下面的代码中得到了分段文件。原因是在第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被认为是错误的?
相关文章:
- C++模板来检查友元函数的存在
- C++字符*缓冲区的大小
- 既然存在危险,为什么项目要使用-I include开关
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 我们可以访问一个不存在的联盟的成员吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++:对不存在的命名空间使用命名空间指令
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- fwrite 不会将缓冲区写入 stdout,除非存在特定的 printf 语句
- Google协议缓冲区-缺少必需的字段,即使所有字段都明显存在
- 在read()之前检查boost::asio缓冲区数据是否存在
- Qt中存在缓冲区溢出错误