C++ Data Structure 学习笔记 (2011.5.2)——Cin的用法详解以及文件的读取

时间:2022-03-31 16:37:05

今天主要学习Pointer和Array的相关内容,这些问题对我来说都是老生常谈了,较为感兴趣的是那个例子。

#include <iostream>
#include <vector>

using namespace std;

 
int main( )
{
    int inputVal;
 vector<int> array;

    cout << "Enter any number of integers: ";
 while(cin>>inputVal){
        array.push_back( inputVal );
 }

    for( int i = 0; i < array.size( ); i++ )
        cout << array[ i ] << endl;
 system("pause");
    return 0;
}

 

 

这个例子用来read unlimited numbers,然后write them.

我一开始的困惑来着于这个unlimited numbers。我以为输入一堆数比如123213213123输出也是这样的123213213123。

结果发现什么都没输出。

 

原因很简单,while(cin>>inputVal)表示持续的读入键盘流,如果一直不加空格,是会被当成一个数的,而这么大的数显然超过了int的范围,并且溢出,无法得到正确的结果。空格在cin中的作用是对输入截断,比如

int a,b;
cin>>a>>b;

cout<<a<<" "<<b<<endl;

如果输入3 4, 得到 3 4

而如果输入34,则认为你只给a进行了赋值,所以还需要继续输入。

 

对于如何让这种以while(cin>>inputVal)格式的连续输入停止有很多方法

1 是直接在最后一个输入的数后面打eof然后回车

2 是在最后一个输入的数后面打ctrl+z然后回车

其实两个是一样的 ctrl+z用了模拟一个eof的信号而已,并不是真的输入的ctrl+z。

 

所以我们看出,空格是cin的杀手,遇到空格普通的cin>>就不好使了,那么如何用cin来接收有空格的一行字符呢?

比如:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include <iostream>( p! R% _1 g& t7 t# w
using namespace std;

void main(){
 char a[20];
 cin.get(a,20);
 cout<<a<<endl;
 system("pause");
}

 

输入:jkl jkl jkl/ M0 /- T4 g0 x- Z; U) `' W6 g, n! T
输出:jkl jkl jkl  j9 v+ z8 u" B5 f% ^' P$ o

输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd              (接收19个字符+1个'/0'), w$ z  d) H  W+ T4 x; b4 `, H

类似的还有 cin.getline()

#include <iostream>( p! R% _1 g& t7 t# w
using namespace std;

void main(){
 char a[20];
 cin.getline(a,20);
 cout<<a<<endl;
 system("pause");
}

 

两个的区别是cin.get()每次读取一整行并把由Enter键生成的换行符留在输入队列中而cin.getline舍弃换行符

(具体见:http://blog.csdn.net/steven20027/archive/2010/05/27/5627292.aspx

最后顺便回顾一下如何从txt中读取一行

我的方法是采用string类中的getline来完成。used with c++ std::string 要用C++就一起都用C++的东东

#include <fstream>
#include <string>

using namespace std;
void main(){ 
 
 string s;
 ifstream myfile("a.txt");
 //myfile.getline(s,256);
 //cout<<s<<endl;
 while(getline(myfile,s))   //   读一行,自动判断换行,丢弃换行符.
            cout<<s<<endl;   //   输出这一行 然后继续读下一行

 system("pause");

}

 

当然也可以用cin.getline这种C-style的来写,没试过。