c++学习笔记:文件流的各类操做

欲使用ifstream和ofstream,首先须要引用fstreamios

#include <fstream>

1、使用ifstream读取文件的所有文本api

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; }

 2、分先后两段,读取文件的所有文本app

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;
   }

3、直接在文件末尾添加一段文字学习

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

4、复制文件的内容,用复制的内容替代之前的内容,其实至关于什么都不干spa

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,下次开始学习sstreamcode

相关文章
相关标签/搜索