zoukankan      html  css  js  c++  java
  • c++学习笔记:文件流的各种操作

    欲使用ifstream和ofstream,首先需要引用fstream

    #include <fstream>

    一、使用ifstream读取文件的全部文本

    ifstream ifs;
       string path("src/test.txt");//考虑到最终程序最终执行环境是在工程目录下的,所以这里用此路径
       ifs.open(path);//open可以传第二个参数,六个值in:以读方式打开;out:以写方式打开,直接写入将覆盖,但是可以移动指针,在文件末尾写入;binary:操作方式将更倾向于二进制;ate:打开时在打开状态输出默认会在文件的末尾(EOF),但未在打开状态会清空该文件;app:输出也是在文件末尾展开,不会清空该文件;trunc:任何打开前的内容,都将会被清空。
    值得注意的是:如果该文件的上层目录不存在的话,将肯定会失败,反之,则没有该文件时候,会自动创建一个

    string str;
    string line;
       if(ifs){//隐式转换为bool
           while(getline(ifs,line)){
                str +=line;
              }
           cout<<str<<endl;
       }else{
           cout<<"真不好意思,打开失败了"<<endl;
       }

     二、分前后两段,读取文件的全部文本

    ifstream ifs;
       string path("src/test.txt");
       ifs.open(path,ios::binary);
       if(ifs){
          ifs.seekg(0,ios::end);//指针指向流的末尾,相对于末尾的偏移量为0,另外此方法还有传入一个参数的重载版本,传入的是一个相对于文件结束位置的绝对值
          int length = static_cast<int>(ifs.tellg());//tellg返回当前指针的位置,从0开始,end指向的刚好是文件结束位置的下一位,所以end的位置刚好是文件的字节数,所以如果是汉字,使用二进制一半一半读取的话,中间一个汉字可能被拆分而成为乱码
          ifs.seekg(0,ios::beg);//可以穿 end:流的末位的下一位,beg:流的开始位置和cur:当前读取位置。
          int strLength1 = length/2;
          int strLength2 = length%2==0?strLength1:strLength1;
          char str1[strLength1+1];
          char str2[strLength2+1];
          ifs.read(str1,strLength1);
          ifs.read(str2,strLength2);
          ifs.close();
          cout<<str1<<endl<<endl<<endl<<endl<<str2;
       }else{
           cout<<"真不好意思,打开失败了"<<endl;
       }

    三、直接在文件末尾添加一段文字

           ofstream ofs;
           string path("src/test.txt");
           ofs.open(path,ios::app);//以append方式打开文件
           string text("三月,伪文学家发情的、无病呻吟的季节");
           ofs.write(text.c_str(),text.length());
           ofs.close();

    四、复制文件的内容,用复制的内容替代以前的内容,其实相当于什么都不干

    ifstream ifs;
        string path("src/test.txt");
        ifs.open(path,ios::in);
        char* data;
        int length = -1;
        if(ifs){
            ifs.seekg(0,ios::end);
            length = static_cast<int>(ifs.tellg());
            ifs.seekg(0,ios::beg);
            char str[length+1];
            data = str;
            ifs.read(str,length);
            ifs.close();
        }
    
        if(length!=-1){
            ofstream ofs;
                ofs.open(path,ios::ate|ios::out);//清空模式
               if(ofs){
                    ofs.write(data,length);
                    ofs.close();
                    cout<<"写入成功"<<endl;
                }
        }

    此外,如果读取一个文件之后,需要读取下一个,直接调用clear方法就可以接着干了。

    嗯,最常用的方法就学到这里,其他的遇到自行查阅api,下次开始学习sstream

  • 相关阅读:
    前言(CSDN也有Markdown了,好开森)
    One usage of recurison: the tower of Hanoi
    使用Android注解来改善代码
    mysql生产环境____主从同步修复案例
    不同类型的指针
    C++ 对象模型
    为什么需要模版成员方法
    理解 traits
    C++ 异常处理
    传const引用代替传值
  • 原文地址:https://www.cnblogs.com/gangmiangongjue/p/7264080.html
Copyright © 2011-2022 走看看