c++那些事儿7.0 I/O流,文件操作

知识点综述:


C++  I/O:
     在iostream头文件中定义
        istream    //通用输入流和其它输入流基类。
        ostream    //通用输出流和其它流基类。
        iostream   //通用输入输出流和其它输入输出流基类。
        在fstream头文件中定义
        ofstream     //文件写操作 内存写入存储设备   
        ifstream     //文件读操作,存储设备读区到内存中  
        fstream     //读写操作,对打开的文件可进行读写操作 
        在strstream头文件中定义
        istrstream  //输入字符串流
        ostrstream  //输出字符串流
        strstream   //输入输出字符串流
cin,cout:
   cin,是istream的派生类的对象,是标准输入流。
   cout,是ostream的派生类的对象,是标准输出流。

操作步骤:
        (1)建立文件流对象;
        (2)打开或建立文件;
        (3)进行读写操作;
        (4)关闭文件;
格式控制输出:
     dec 10进制输出,   hex  16进制输出    oct 8进制输出.
     setfill(c)设置填充字符c ,  setprecision(n)设置实数的精度的n位。
     setw(n)设置字段宽度n 
     setiosflags(ios::fixed)设置浮点数以固定的小数位显示
     setiosflags(ios::left)输出数据左对齐,   setiosflags(ios::right)输出数据右对齐
ios类中:
    void open(const char* filename,ios_base::openmode mode);
mode打开文件的方式
  ios::binary: 以二进制方式打开文件,缺省的方式是文本方式
   ios::in: 文件以输入方式打开(文件数据输入到内存)(ifstream对象默认方式就是这个)
   ios::out: 文件以输出方式打开(内存数据输出到文件)(ofstream对象默认的打开方式

常识:
 文本文件和二进制文件
 文本文件:由字符序列组成,以字符(character) 为存取最小信息单位,也称“ASCII码文件”。
 二进制文件:由二进制数组成。

 相关的函数:
    void open( const char *filename );  
             //函数open()用于文件流。它打开filename 并将其与当前的流相关联。
    void close(); 
           //函数关闭相关的文件流。   
    ostream &flush();  
           //flush()函数可以引起当把前流的缓冲区写出到附属设备中去。
    int get();   
         //读入一个字符并返回它的值,重载函数特别多。
    ostream &put( char ch );  
        //函数put()用于输出流,并把字符ch写入流中。
    istream &get( char &ch );  
       //读入一个字符并把它存储在ch, 
    istream &getline( char *buffer, streamsize num );  
       //getline()函数用于输入流,读取字符到buffer中,
    istream &read( char *buffer, streamsize num ); 
           //函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。
如果碰到EOF,
     read()中止ostream &write( const char *buffer, streamsize num );

        //write()函数用于输出流,从buffer中写num个字节到当前输出流中。



看一张I/O相关类的图
c++流的关系图.jpg



常见对象的解释

c++ I-O.PNG


看代码

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
void  display();
void writeFile();
void readFile();
void readBinaryFile();
void copyFile();
using namespace std;
int main() {
    display();   //格式控制符的运用。
    writeFile();
    readFile();
    readBinaryFile();
    copyFile();
    system("pause");
    return 0;
}

void  display() {
    int a = 123;
    float b = 1.2345f;
    double c = 1.23456;
    string d = "dflx";

    cout << "dec:" << dec << a << endl;
    cout << "hex:" << hex << a << endl;
    cout << "oct:" << oct << a << endl;
    cout << setw(5) << d << endl;
    cout << setfill('*') << setw(5) << d << endl;
    cout << setw(5) << setiosflags(ios::right) << a << endl;
    cout << setw(5) << setiosflags(ios::left) << a << endl;
    cout << setiosflags(ios::scientific) << setprecision(8);
    cout << "c=" << c << endl;
    cout << "c=" << setprecision(5) << c << endl;
    cout << "------------------"<<endl;
    cout.put('a') << endl;
    putchar('b');
    cout << endl;
    cout << "enter a sentence:";
    int ch;
    while ((ch = cin.get()) != '#')
        cout.put(ch);
    cout <<endl<< "--------------------格式控制结束------------------------" << endl;
}

//文本方式写
void writeFile() {
    
    /*
      ofstream outfile; 建立ifstream对象
      outfile.open("D:\\workspace_java\\File\\g.txt");  将对象与文件关联
      等价面的。
    */
    cout << "-----------写文本文件------------" << endl;
    ofstream outfile("D:\\workspace_java\\File\\g.txt", ios::out);
    if (!outfile) {
        cerr << "open error" << endl;
        exit(1);
       }
    string  str= "hello c plus plus \n";
    outfile << str;  //使用该对象将数据输出到文件
    outfile.close();

}
//文本方式读
void readFile() {
    cout << "-----------读文本文件------------" << endl;
    ifstream ifs;
    ifs.open("D:\\workspace_java\\File\\g.txt");
    char str[255];  //定义一个字符数组
         //ifs >> str; //将文件中的数据读到str中。但是c++插入操作符遇到空字符变停止输出。
    ifs.getline(str,255);
    cout << str << endl;
    cout << "------------------" << endl;
    /*如果我们想要在命令行中写一段话,而且这段换中包含了空格和回车,
    那么我们就应该利用上面getline()函数的第三个参数,*/
    ifstream file("D:\\workspace_java\\File\\a.txt");
    if (!file) {
        cerr << "文件打开失败" << endl;
    }
    char str1[1024];
    file.getline(str1, 255, 0);
    cout << str1 << endl;

}

/*
对于二进制文件的读写,我们必须强调的一点就是打开文件属性必须添加:ios::binary,
其实就是告诉系统,我要按照二进制格式进行读写文件了。
*/
//二进制文件读
void readBinaryFile() {
    cout << "-----------读二进制文件------------" << endl;
    ifstream file;
    file.open("D:\\workspace_java\\File\\g.txt",::ios::binary);
    if (!file) {
        cerr << "文件打开失败" << endl;
    }
    char str[1024] = { 0 };
    file.read(str, sizeof(char) * 1024);
    cout << str << endl;
    file.close();

}
/*
记住,write有两个参数,第一个为字符数组参数,第二个需要输入到文件的数据的
大小
举列子:
   ofstream fout("text.bat", ios::binary);关联时候。
   string str = "Hello word";
   fout.write(str.c_str(),sizeof(char)*(str.size()));
*/

//文件复制
void copyFile() {
    ifstream copy_file("D:\\workspace_java\\File\\春雨.txt");
    ofstream  new_file("D:\\workspace_java\\File\\我的春雨.txt");
    if (!copy_file || !copy_file) {
        cerr << "文件打开失败" << endl;
        return;
    }

    while (!copy_file.eof()) {
        char buf[1024];
        copy_file.read(buf, sizeof(char) * 1024);
        new_file.write(buf, sizeof(char) * 1024);
    }
    cout << "文件复制成功" << endl;
}



结果如下

结果.PNG


重要知识点总结:

总结 几个重要的东西:
     文件操作的流程
        (1)建立文件流对象; 
                   ofstream     //文件写操作 内存写入存储设备   
                   ifstream     //文件读操作,存储设备读区到内存中  
        (2)打开或建立文件;
                  void open(const char* filename,ios_base::openmode mode);
            mode打开文件的方式:
 ios::binary: 以二进制方式打开文件,缺省的方式是文本
 ios::in:    文件以输入方式打开(文件数据输入到内存)(ifstream对象默认方式就是这个)
 ios::out:   文件以输出方式打开(内存数据输出到文件)(ofstream对象默认的打开方式
        (3)进行读写操作;
                   istream &getline( char *buffer, streamsize num );
                   istream &read( char *buffer, streamsize num );
             //函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。
如果碰到EOF,read()中止
                   ostream &write( const char *buffer, streamsize num );
                   //write()函数用于输出流,从buffer中写num个字节到当前输出流中。
        (4)关闭文件;
            close();

 文件复制中:
          bool eof();
             //如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false。 


c++ 的 I/O不会比java差,只是各自实现的方式不一样。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,743评论 0 33
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,963评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,608评论 18 399
  • 一大早,就和主任吵了一架,是不是太任性了呀,吼吼···明明现实存在的问题,为什么偏偏说不可能,是你的眼睛聋了,耳朵...
    小丝雨阅读 119评论 0 1
  • http://www.veryhuo.com/a/view/98081.html Charles抓包charles...
    janezhang阅读 340评论 0 0