• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-08-28)  C++ |   9 条评论  10 
    文章评分 0 次,平均分 0.0

    stl中对文件读写的函数在头文件fstream中定义,它的基本对象模型如下:

    其中包含三个对象ifstrea、ofstream和fstream,分别对文件提供只读、只写、读写功能,从其对象继承关系也可以看出这一点。下面就简单的介绍下基本的文件方法

    打开文件

    打开文件一般有两种方式:

    1、在构造函数中打开

    ifstream input("r:\\3.txt", ios::in | ios::binary);

    2、通过open函数打开

    ofstream output;
    output.open("r:\\3.txt", ios::out | ios::binary);

    不管用哪种方式,都需要传入两个参数:第一个参数是文件名,第二个参数是打开选项,常见的选项有:in、out、app(append)、binary等。第二个参数也可以不传,此时,对于ifstream,就是以读方式打开、ofstream以写方式打开。

    检查是否打开成功

    可以通过good函数检查文件是否打开成功:

    if (!input.good())
    {
    cout << "file open fail" << endl;
    return 1;
    }

    这个good函数也可以去掉,直接检查steam是否为真(这样可读性不好,不建议,但许多历史代码喜欢这么写,还是应该学习一下)。

    if (!input)
    {
    cout << "file open fail" << endl;
    return 1;
    }

    定位和获取当前位置

    有的时候,我们需要对文件进行随机访问,如连接两个文件的时候就要定位到文件的末尾。在stl中可以通过stream对象的seekg实现这一功能。与之相对的就是获取当前位置,函数为tellg,如下代码演示了利用这两个函数获取文件长度。

    input.seekg (0, ios::end);
    int length = input.tellg();

    tellg函数比较简单,没有参数,直接返回当前位置。而seekg有两个参数:第一个参数是偏移量,可以为负数;第二个参数则是相对位置,可以选取ios::beg(begin)、ios::end(end)、ios::cur(current)三个值,这个参数可以省略,省略的时候是取的ios::beg,从文件头定位。

    关闭文件

    关闭文件有两个方法:

    1. 调用close方法显式关闭
    2. 对象删除的时候隐式关闭

    具体使用哪个这个看个人喜好了,就我个人而言,我一般喜欢在构造函数中打开文件,不习惯调用open函数,因此也比较倾向于隐式关闭,不调用close函数。

    读写文件

    下面我们就以一个文件拷贝为例简单的介绍下读写的方式:

    1、传统的缓冲区读写

    char buf[1024];
    while(!input.eof())
    {
    int count = sizeof(buf);
    input.read(buf, count);
    output.write(buf, count);
    }

    这里主要用到了三个函数:read函数为读,write函数写,eof检查是否读取到了文件结尾。

    2、利用string逐行读写

    string line;
    while(std::getline(input, line))
    output << line << endl ;

    这里用了getline行数从流里每次读写一行,用 << 运算符将内容写入流,不过这种方式仅仅适合读写文本文件。

    3、流方式读写

    output << input.rdbuf();

    这个方式非常简单,只用了一行代码就可以实现:用rdbuf函数获取读缓冲区,用 << 运算符在两个流对象之间建立管道。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1862.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享