碰到一个基本输入输出流的问题,以及对于getline使用总结。

#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。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值