如何正确使用istream :: get(char * s,streamsize n,char delim);

时间:2013-02-18 14:59:45

标签: c++

文档说:

istream::get ( char* s, streamsize n, char delim );

// Extracts characters from the stream and stores them as a 
// c-string into the array beginning at s

我试图分析这个功能的作用。它需要一个“按值”的指针。也就是说它无法分配动态内存并将指针s设置为它。它只能更改指针s指向的内容。

但是如果函数无法执行动态内存分配,那么如何返回长度未知的输出呢?我该如何使用这个功能?我应该预先分配内存并将指针传递给s,然后自己将其删除吗?

3 个答案:

答案 0 :(得分:5)

文档很清楚:

  

将它们作为c-string存储到从s

开始的数组中

- s必须指向一个足以容纳读取字符串的有效数组。

  

如何返回长度未知的输出

最大长度是已知的,它是n(实际上是n - 1,因为为C字符串的空终止保留了一个字符。)

但是,考虑到您的问题,使用the std::string overload of getline可能更合适。

答案 1 :(得分:4)

您应该预先分配大小为s的内存(由n指向),将s传递给第一个n并将get传递给该函数的第二个参数。这样,n将读取最大s个字节(包括终止null)并将它们复制到const int n = 50; char *s = new char[n]; cin.get(s, n); //... delete []s; 指向的缓冲区

如果你的缓冲区是本地的(堆栈中的一个数组,让我们说),你不必删除它(事实上你不能)但是如果它是动态的(即由new []分配,malloc ,运营商新的或其他什么)然后你必须相应地释放它。

示例:

std::string

注意:虽然这是有效的,但正如其他人所评论的那样,请更好地使用{{1}}。

答案 2 :(得分:3)

您应该像这样使用它:

const int size = 10;
char s[size]; //large enough to fit string
stream.get(&s[0], size, '\n');

您预先分配了所需的缓冲区,并确保它足够大以适应目标字符串。