现在的位置: 首页 > 综合 > 正文

C++初学者指南 第十一篇(10)

2014年03月06日 ⁄ 综合 ⁄ 共 2246字 ⁄ 字号 评论关闭

转载请标明出处:http://blog.csdn.net/zhangxingping

基本技能 11.10:更多的输入/输出函数

    除了前面介绍的这些输入/输出函数之外,C++中还定义了其他的可用于输入/输出的函数。其中一些也是很有用的。下面我们就对其中部分进行介绍。

get()函数的不同版本

    除了前面介绍的基本用法外,get()函数还有其他不同的重载形式。其中最常用的三种重载的形式如下:

istream &get(char *buf, streamsize num);

istream &get(char *buf, streamsize num, char delim);

int get();

    第一种形式:读取字符并存储到大小为num个字节的buf指示的空间中,直到读取的字符数量为num-1个,或者遇到了一行的结束,或者遇到了文件结束。其中buf指示空间中的内容将是以’/0’结束的字符串。如果在输入的流中遇到换行符,则该字符依然保留在流中。

    第二种形式:读取字符并存储到大小为num个字节的buf指示的空间中,直到读取的字符数量为num-1个,或者遇到了由delim指定的字符,或者遇到了文件结束。buf指示的空间内容将是以’/0’结束的字符。如果是遇到了delim指定的字符,则这个字符会保留在流中。

    第三种形式:被重载的第三种形式返回流中的下一个字符。遇到文件结束的时候返回EOFEOF是在<iostream>定义的。

get()函数一个很好的用法就是用来读取包含了空白字符的字符串。我们都知道当使用>>来读取字符串的时候,遇到空白字符就会停止读取操作。这就使得>>不能完成读取含有空白字符的字符串。然而,我们可以使用get(buf,num)来解决这个问题,如下:

//使用get()函数来读取含有空白字符的字符串
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char str[80];
    cout << "Enter your name:";
    cin.get(str,79);
    cout << str << "\n";
    return 0;
}

其中,这里使用的get()函数缺省的界定符就是换行符。这样就使得get()函数可以像标准的gets()函数一样工作了。

getline()

    另外一个用于输入的函数就是getline()。他是输入流的成员函数,其原型如下:

istream &getline(char *buf, streamsize num);

istream &getline(char *buf, streamsize num, char delim);

第一种形式:读取字符并存储在buf指示的空间中,直到读取了num-1个字符,或者遇到了换行字符,或者遇到文件结束。buf指示的空间的内容将是以’/0’结束的字符串。如果在读取的过程中遇到了换行字符,该字符会被摘出,不会放入buf空间中。

第二种形式:读取字符并存储在buf指示的空间中,直到读取了num-1个字符或者遇到了delim指示的字符,或者遇到了文件结束。buf指示的空间内容将是以’/0’结束的字符串。如果在读取的过程中遇到了delim指定的字符,则该字符会被摘出,不会被放置在buf指示的空间中。

从上面的描述可以看出,这两个版本的getline()实际上和get(buf,num)以及get(buf,num,delim)的功能是一样的:都是从输入流中读取字符,并把字符放置在buf指示的空间中,直到读取字符的数量为num-1或者是遇到由delim指定的界定符。唯一的区别就在于getline()函数会从输入流中读取并摘出界定符,而get()函数不会。

判断是否遇到了文件结尾

    我们可以通过使用成员函数eof()来判断是否遇到了文件结尾,其原型如下:

bool eof();

当遇到文件结尾的时候,函数返回真值,否则返回假值。

peek()和putback()

    我们可以通过使用peek()函数来窥探一下输入流中的下一个字符是什么而不用把他从流中移除。其函数原型如下:

int peek();

peek()函数返回输入流中的下一个字符;如果遇到文件结束则返回EOF。返回的字符存储在返回值的低字节中。我们可以通过使用putback()函数把从流中读取到得最后一个字符重新放回到流中(原文如下:You can return the last character read from a stream to that stream by using putback()。这种描述容易让人误认为该函数是用来把读取的最后一个字符重新放回到输入的流中。其实是可以把任意的由参数c指示的字符放回到流中的。)。其函数原型如下:

istream &putback(char c);

其中c是读取的最后一个字符(c是指定的任意字符)。

flush()

    在进行输出的时候,数据不会立刻被写入到与流相关联的物理设备中去的;而是被存储在一个内部的缓冲区中,直到缓冲区满了才会被写入到设备中。然而,我们可以使用flush()函数来强迫性地把数据写入到物理设备中。其函数原型如下:

ostream &flush();

调用该函数在很多恶劣的环境下是很合理的。(比如在经常出现电力短缺的情况下)。

    注意:关闭文件或者终止程序也会强制性地把缓冲区的数据写入到相关联的设备中去。

抱歉!评论已关闭.