getline() 函数中 char* 缓冲区的分段错误
segmentation fault with char* buffer in getline() function
我在下面的代码中得到了分段文件。
原因在第 10 行,我猜我在哪里使用 char* 缓冲区。
我想知道这是为什么。
是不是buffer中的内存还没有分配?
代码如下:
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 }
Is it because the memory in the buffer is not still allocated?
是的。事实上,您甚至 没有 缓冲区。指针 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?
我在下面的代码中得到了分段文件。 原因在第 10 行,我猜我在哪里使用 char* 缓冲区。 我想知道这是为什么。
是不是buffer中的内存还没有分配?
代码如下:
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 }
Is it because the memory in the buffer is not still allocated?
是的。事实上,您甚至 没有 缓冲区。指针 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?