繁体   English   中英

istream中的getline和basic_string中的getline

[英]getline in istream and getline in basic_string

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') 

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

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

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

std::getline接受以下参数:

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

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

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

  • 一个char缓冲区。
  • 可选地,行分隔符char。

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

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

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

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

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

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);

但是在这里使用getlinestring重载可能是最好的。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM