C++ 流的随机访问

    1、几个函数

    为支持随机访问,IO类型维护一个“标志”,该“标志”能决定从何处读或写。

    IO类型提供了两对函数:seekg()/tellg()和seekp()/tellp()。前者有输入流使用,后者由输出流使用。这四个函数的功能如下:

                    seekg()  //重新定位输入流中的位置

                    tellg()  // 返回输入流中标记的当前位置

                    seekp()  // 重新定位输出流中的位置

                    tellp()  // 返回输出流中标记的当前位置

 

    seek()有两个版本,一个是定位到文件的“绝对”位置,另一个是移到给定位置的字节偏移量处。即:

                   seekg(position)   seekg(offset,dir)

                   seekp(position)   seekp(offset,dir)

    position--绝对位置

    offset--偏移量

    dir--从何处偏移的指示器。可取beg(流的开头)、cur(流的当前位置)、end(流的末尾)。当前位置有tell()返回,返回的类型由pos_type来代替。

 

    2、实例 -- 读写同一文件

    有一文件“test.txt”,在其末尾加上一新行,该行包含每一行的字符数。假定文件的内容为:

    123456
    12345
    1234

    修改过的文件应为:

    123456
    12345
    1234
    6 5 4

   

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main()
{
    fstream in_out;
    in_out.open("test.txt", fstream::ate | fstream::in | fstream::out);
   
    if (!in_out)
    {
        cerr << "Unable to open file!" << endl;
        return EXIT_FAILURE;
    }

    ifstream::pos_type end_make = in_out.tellg();
    int ncount = 0;
    string strline;
    in_out.seekg(0, fstream::beg);

    while ( in_out && in_out.tellg() != end_make && getline(in_out, strline, '\n'))
    {
        ncount = strlen(strline.c_str());

        ifstream::pos_type mark = in_out.tellg();
       
        in_out.seekg(0, fstream::end);      
        in_out << ncount;
        if ( mark != end_make )
        {
            in_out << " ";
        }

        in_out.seekg(mark);
    }
    in_out.clear();
    return 0;
}

你可能感兴趣的:(C++,String,IO,File)