istream中的getline和basic_string中的getline

时间:2010-12-30 17:31:25

标签: c++

string text;
getline(text.c_str(),256);

1)我收到错误“错误:没有匹配函数来调用'getline(const char *,int)” 上面有什么问题,因为text.c_str()也返回一个指向字符数组的指针。

如果我这样写

char text[256]
cin.getline(text, 256 ,'\n'); 

它工作正常。 cin.getline和getline有什么区别?

2)怎么来

text string;
getline(cin,text,'\n') 

接受整行作为输入。指向这一个字符数组的指针在哪里?

4 个答案:

答案 0 :(得分:6)

text.c_str()会返回 const char *。您可能不会使用它来修改字符串的内容,以任何方式。它只存在,以便您可以将字符串数据传递给旧的C API函数,而无需复制。您不能进行更改,因为没有办法保存数据的字符串对象可能找不到它们,因此这将允许您打破字符串的不变量。

此外,std::getline 接受完全不同的参数。 (如果你花了两秒钟向Google输入'std :: getline',你就会知道这一点。)错误意味着它所说的内容:“没有匹配的调用函数”意味着“你不能用这些类型调用函数参数“,因为函数的每个重载都接受不同的(并且不兼容)。

std::getline接受以下参数:

  • 一条小溪。你必须传递这个,因为否则它不知道从哪里读取。
  • 要读入的字符串对象。 一个字符缓冲区。
  • (可选)行分隔符char(与流getline成员函数相同)。

实际上没有“cin.getline”这样的功能。你所说的是对象“cin”的成员函数“getline” - 一个在你#include <iostream>时为你定义的全局变量。我们通常根据函数定义的类来引用它 - 因此,std::istream::getline

std::istream::getline接受以下参数:

  • char缓冲区。
  • (可选)行分隔符char。

它不需要stream参数,因为它是流的成员函数:它使用我们称之为的任何流。

答案 1 :(得分:3)

我真的没有得到提问者试图做的事情。

C ++允许函数重载,所以编译器正在寻找一个名为getline的自由函数,它匹配你传递的参数,并且不存在这样的函数,也不存在(无论如何getline(const char*, int)会做什么?)< / p>

多次询问这个问题为什么getline(istream&, string&)是一个“自由”函数,而不是iostream接口的一部分。建议的答案是iostream过时的STL或者iostream没有依赖于basic_string类(任何地方,这也是为什么打开文件是用原始指针完成的),而Herb Sutter会赞扬让getline成为一个自由函数,因为他觉得是类成员函数应该是最小的(并且std :: string有太多,例如find函数可以是使用该类的免费函数)。

关于该功能的一件事是,它是多么有用,因为你不需要预先分配一个缓冲区并“猜测”它有多大。 (话虽如此,如果你从一个大文件读到一个std :: string,如果没有找到新行,你可以使用bad_alloc!)。

答案 2 :(得分:1)

text.c_str()const个字符的数组。 const表示您和任何函数(包括任何类型的getline)都不会写入其中。

没有可移植的方式将string用作可写字符数组。但必要时,您可以改为使用vector<char>

std::vector<char> buffer(256);
std::size_t len = cin.getline(&buffer[0], buffer.size());
std::string text(&buffer[0], len);

但是,使用string的{​​{1}}重载可能最好。

答案 3 :(得分:1)

string::c_str()会返回const char *,而非char *getline使用字符串,所以你想要的是

string text;
getline(cin, text, '\n');

此版本的getline允许字符串根据需要增长。如果您需要将其限制为特定数量的字符,则需要使用上一个答案中的vector<char>