#include <iostream>
using namespace std;
#include <vector>
istream& getStream(istream & input)
{
cout<<input;
}
int main()
{
istream s;
std::string str;
cout<<"请输入一个string:";
while( cin>>str ) {
s<<str;
}
getStream(s);
return 0;
}
今天弄这么个程序的时候,出现这个错误。
google了一通后发现是 istream是所有输入标准类型的基类,没有默认构造函数。同样,ostream也没有,所以istream s 无法被编译器初始化,所以报错。
下面是对于getline的用法总结,同时也吐槽下,VC6真的太容易误导人了。
一直报 多了一个参数的错误,但是我明明查到msdn中是有这个方法的,通过getline传递一个basic_istream,和string对象获取一行数据,默认是换行结束。如下图:
后面查看msdn的getline的用法之后发现,用std::cin是不报错的,可以只传两个参数,最后的delim是有默认值的。
下面是msdn对getline的用例:源地址。
#pragma warning(disable:4786)
#include <string>
#include <iostream>
using namespace std;
#if _MSC_VER > 1020 // if VC++ version is > 4.2
using namespace std; // std c++ libs implemented in std
#endif
void main()
{
string s1;
cout << "Enter a sentence (use <space> as the delimiter):";
getline(cin,s1, ' ');
cout << "You entered: " << s1;
}
原来我用的ifstream ,必须要包含 #include <fstream>这个头文件。搞了两天,最初是报getline未定义的错误。一点一点找问题,找到这个。
对于getline的用法确实有很蛋疼的地方。getline主要有两类重载方法原型。一类是这个:
template<class E, class T, class A>
basic_istream<E, T>& getline(
basic_istream <E, T>& is,
basic_string<E, T, A>& str,
E delim);
对于用法: 上面提供了微软的官方用例,就不说了。这个方法是在string头文件中声明的,所以需要这两句话 #include <string>,using namespace std;
详细请点这里。
第二类重载方法是这个:
istream::getline
istream& getline( char* pch, int nCount, char delim = '\n' );
istream& getline( unsigned char* puch, int nCount, char delim = '\n' );
istream& getline( signed char* psch, int nCount, char delim = '\n' );
Parameters
pch, puch, psch
A pointer to a character array.
nCount
The maximum number of characters to store, including the terminating NULL.
delim
The delimiter character (defaults to newline).
传递一个char *,和buffer_size 进去,获取一行数据。用法:
char str[256];
cin.getline( str, 256 );
同时对于这两类 重载方法的区别,第一类, 通过getline( cin, str ); str获取到的是输入流下一行的数据。下面参考自这里
getline()这个函数接受两个参数:一个输入流对象和一个 string 对象。getline 函数从输入流的下一行读取,并保存读取的内容到不包括换行符。和输入操作符不一样的是,getline 并不忽略行开头的换行符。只要 getline 遇到换行符,即便它是输入的第一个字符,getline 也将停止读入并返回。如果第一个字符就是换行符,则 string 参数将被置为空 string。