• C/C++中的文件操作(2)


    C++文件操作。
    C++中引入了stream,相关的头文件<fstream>,支持文件输入与输出,还有两个<ifstream>和<ofstream>,分别支持文件读入和写入。

    文件的打开与关闭
    fstream作为一种对象,它的操作由构造函数,成员函数来完成。
    fstream ( ); explicit fstream ( const char * filename, ios_base :openmode mode = ios_base::in | ios_base::out );
    fstream f("input.txt",fstream::in|fstream::out);
    构造函数,在构造的时候可以直接指定要打开的文件名,指定打开模式,input或者output,或者同时input和output,也可以append或者binary模式,可以使用|进行组合。在不指定打开模式的时候,采用默认值,in|out同时可用。
    如果不在构造的时候打开文件,可以使用open成员函数来打开文件,open的参数与构造函数的参数类似。但是它没有返回值。
    void open ( const char * filename, ios_base :openmode mode = ios_base::in | ios_base::out );
    fstream f;
    f.open("input.txt",fstream::in|fstream::out)
    如果要判断文件是否打开成功,需要使用is_open来判断是否处于打开状态。
    成员函数close则用来关闭文件。

    内容的读取与写入
    C++引入了流操作,流操作符>>和<<用来从文件读取内容或把内容写入文件。
    istream& operator>> (type &val);与fscanf对应,格式化的读取内容,格式由值的type确定。
    读取字符串的时候,会读到空格或者换行结束。
    也有其它格式控制的函数,如hex以十六进制读取,dec以十进制读取,skipws跳过空白,等。
    成员函数get,可以读取单个字符,也可以读取字符串,并指定读取的长度,终止符号(一般是'\n'),也可以读到stream里面。
    成员函数getline,读取一行内容到字符串,指定字符串长度(包括字符串终止符号'\0'),也可以指定终止符号。
    成员函数ignore(streamsize n=1,int delim=EOF),忽略n个字符,或者到delim结束。
    还有read和readsome也可以读取输入。
    ostream& operator<< (type val);流输出,一直觉得C++的输出格式控制没有C的printf方便,也就一直没有好好看看C++是怎么控制输出个好似的。这次还是好好看看吧。
    hex/dec/oct 按16/10/8进制输出
    [no]showbase,(不)显示基数前缀,
    [no]showpoint,(不)显示小数点,
    [no]showpos,(不)显示正号
    fixed,定点输出
    scientific,科学记数法
    left/internal/right,左/右对齐
    flush,立即输出
    [no]unitbuf,(不)单元输出,
    [no]uppercase,全大写输出,
    setw,设置宽度
    也可以通过成员函数setf来设置输出格式。
    输出也可以用put,write等成员函数,<<应该就够用了,暂时就不看了。
    put,输出单个字符,
    write(char* buf,int size),写数据块。

    关于指针在文件中的位置,还是看看吧。
    streampos tellp()得到当前位置,
    seekp(streampos pos),设置当前位置,设置到文件头,pos=0,
    seekp(streamoffset offset,ios_base::seek_dir),以相对位置设置当前位置,参考可以是ios_base::beg/cur/end。

    在C中,ftell/fseek/fsetpos/rewind也是跟指针在文件中的位置相关的函数。

    文件输入输出重定向

    与C中重定向不同,C++中文件是stream对象,不可以直接赋值给stdin,也没有reopen函数,而是cin或者cout使用的rdbuf()成员函数。如果文件重定向结束,需要将cin还原为stdin,那么可以在重定向之前,备份cin的rdbuf,参考http://www.cnblogs.com/shilcare/archive/2010/09/02/1816062.html

    示例代码如下:

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        fstream fin("input.txt",fstream::in);
        fstream fout("output.txt",fstream::out);
       streambuf *backup;      // backup the cin streambuf
      backup = cin.rdbuf(); cin.rdbuf(fin.rdbuf());
    // input from fin cout.rdbuf(fout.rdbuf()); // output to fout char buf[256]; while(cin) { cin.getline(buf,256); // read a line from input.txt string line = buf; cout << line << endl; // output the line to output.txt }
      cin.rdbuf(backup);
    return 0; }

    至此,文件操作基本结束。

  • 相关阅读:
    HTTP本地代理服务器遇到的问题
    SMTP协议(Python实现)
    MOS_Chapter2_Process And Thread
    数据库系统概念Chapter2关系模型
    数据库系统概念 Chapter1介绍
    数据库系统概念第六版 答案
    python之sys.argv[1] IndexError: list index out of range
    计算机网络自顶向下之应用层套接字编程作业Web服务器
    罗技G302按一下效果是按两下
    第二部分1.3遍历dom
  • 原文地址:https://www.cnblogs.com/Frandy/p/cpp_file_op.html
Copyright © 2020-2023  润新知