C++数据类型——C-串与string(2)
Author: yuexingtian
Date: 2008-10-30 Thursday
1.string与C-串的输入输出(string & C-string I/O)
通过循环读入单词操作将内容送到变量中,直到读不到数据(缓冲区读完,并且没有数据连接,
则流状态变成false)例:
【string】
#include #include using namespace std; int main() { for(string s;cin>>s;) //循环语句(你输入什么敲回车就会出来什么) cout< cout< return 0; } |
或者:
【字符数组】
#include //#include using namespace std; int main() { for(char a[10];cin>>a;) cout< cout< return 0; } |
cina>>的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,
将单词读入,当遇到空格时结束本次输入。
也可以通过getline将其一次性的输入:
【string】
#include #include using namespace std; int main() { string s; getline(cin,s); cout< return 0; } |
或者:【字符数组】
#include #include using namespace std; int main() { char a[20]; cin.getline(a,20); cout< return 0; } |
两者使用getline格式上有差异。getline总是将行末的回车符滤掉。
在本次的输入中没有什么影响,但是若有许多行,且行中还夹杂着其他类型的数据时,
借助于getline然后再逐个分解行中各数据是简明的,了解这一点很重要!
如果是逐个字符输入,那应如何呢:
#include #include using namespace std; int main() { for(char ch;(ch=cin.get())!='\n';) cout< cout< return 0; } |
要注意的是:字符指针或字符数组操作是陈旧的,用它和string两种操作的方式举例是为了便比较边,学习string。
2.string流(string Streams)
如果有一个文件yuexingtian.txt,有若干行,但不知道每行中含有几个整数,要编程输出每行的整数和,
怎么办?
由于cin>>不能辨别空格和回车的差异,因此只能用getline的方式逐行读入数据到string变量中,
但在string变量中分离若干个整数还是显得有点吃力。
一个好的方法是用string流:
//==============yuexingtian-->begin=================
#include
#include
#include
using namespace std;
//--------------------------------
int main()
{
ifstream in("yuexingtian.txt");
for(string s;getline(in,s);)
/*
getline(in,s)为从输入文件流中读入一行数据,放入string变量s中.
由于整行地读入,读入到s中时,文件中的每个换行符都丢掉了.
*/
{
int a,sum=0;
for(istringstream sin(s);sin>>a;sum += a);
/*istringstream对象可以绑定一行字符串,
然后以空格为分隔符把该行分隔开来*/
cout<//===========http://yuexingtian.cublog.cn============
|
yuexingtian.txt文件内容为:
运行结果:
istringstream是输入string流,它在sstream头文件中说明。该语句类似流操作,只不过创建sin流时,
其参数为string对象。它将string的实体看作是一个输入流,因而,sin>>a即是从string流中输入整数到a中,
输啊输,一直输到string中的最后一个整数!
string流很有用,有时候要将内容先逐个输出到string中,最后才根据计算结果来安排输出格式。
getline函数的返回是流状态,通过它可以判断文件是否还有数据行可读。
阅读(2013) | 评论(0) | 转发(0) |