• C++文件读写


     

    1 简单读写文件

    1 #include <fstream>  
    2 ofstream         //文件写操作 内存写入存储设备   
    3 ifstream         //文件读操作,存储设备读区到内存中  
    4 fstream          //读写操作,对打开的文件可进行读写操作 

    写文件用ofstream和ostream方法(如<<),读文件用ifstream和istream方法(如>>),读写文件可以用fstream,具体步骤个人总结为三步走:

    写文件:

      1.创建一个ofstream对象     ofstream out;

      2.将对象与文件进行关联      out.open("1.txt");  

      3.用cout方式使用该对象      out<<"123456"; 

    其中前两步可以合并为ofstream out("1.txt");

    读文件:

      1.创建一个ifstream对象      ifstream in;

      2.将对象与文件进行关联      in.open("1.txt");  

      3.用cout方式使用该对象     string x;   in>>x; 

    其中前两步可以合并为ifstream in("1.txt");  

    注意:对象名称可以随意命名,不一定非得是in或out。

       文件读写完毕后文件自动关闭,亦可显示的关闭文件的连接,比如in.close();

    2 文件模式

    无论是使用文件名初始化文件流对象还是使用open()方法,都可以指定文件模式的第二个参数

    ios::in       打开文件以便读取

    ios::out    打开文件以便写入

    ios::ate        打开文件移动到文件尾

    ios::app       内容追加到文件尾

    ios::trunc     删除之前内容再写入

    ios::binary    二进制文件

    这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如

    1 fstream out("Hello.txt", ios::in|ios::out)

    3 利用流复制文件的例子

     1 #include <iostream>
     2 #include <fstream>
     3 #include <cstdlib>
     4 
     5 using namespace std;
     6 void cpf(char *a,char *b);
     7 
     8 int main()
     9 {
    10     char sourcefile[100];
    11     char copyfile[100];
    12     cout<<"请输入要复制的文件路径"<<endl;
    13     cin>>sourcefile;
    14     cout<<"请输入要粘贴的文件路径"<<endl;
    15     cin>>copyfile;
    16 
    17     cpf(sourcefile,copyfile);
    18 
    19     return 0;
    20 }
    21 
    22 void cpf(char *a,char *b)
    23 {
    24     fstream in(a,ios::in | ios::binary);
    25     if(!in.is_open())
    26     {
    27         cerr<<"源文件不存在"<<endl;
    28         exit(EXIT_FAILURE);
    29     }
    30     fstream out(b,ios::out | ios::binary);
    31     if(!out.is_open())
    32     {
    33         cerr<<"路径错误"<<endl;
    34         exit(EXIT_FAILURE);
    35     }
    36     out<<in.rdbuf();
    37     cout<<"文件复制成功"<<endl;
    38 }

     需要注意的地方

    1.文件路径是char数组,传递参数时应该将形参设为指针

    2.复制文件应该用ios::binary(二进制模式),原因是使用二进制文件模式时,程序将数据从内存传递给文件,将不会发生任何隐藏的转换,而默认状态下是文本模式,复制的内容可能会发生改变(参见c++ primer plusP695)

    3.关于 rebuf():复制文件时是从一个流对象复制流入另外一个流对象,需要使用rebuf(),rebuf()的功能就是使流重定向

    4.exit(EXIT_FAILURE)相当于exit(1),exit(EXIT_SUCCESS)相当于exit(0)

    5.注意#include<fstream> 也需要和using namespace std 搭配

    4 随机存取

    利用对文件指针的操作可以实现随机存取,考察函数:

    定位文件指针函数:seekg()将输入指针移动到指定文件位置(对应读文件);seekp()将输出指针移动到指定文件位置(对应写文件),其原型有两种:

     (1) istream& seekg (streampos pos);                                              

    //定位读文件指针到离文件开头特定距离(单位为字节)

     (2) istream& seekg (streamoff off, ios_base::seekdir way);                

    //定位读文件指针到离第二个参数特定的距离(单位为字节) 第二个参数可以是:

    ios_base::beg  文件开头
    ios_base::cur   当前指针位置
    ios_base::end  文件结尾位置

    seekg与之类似,ios_base::beg 亦做ios::beg

    检查文件指针当前位置,对输入流采用tellg()方法,对输出流,采用tellp()方法,一个C++获取文件大小的方法是:

    1 in.seekg(0,ios::end);
    2 long size;
    3 size = in.tellg();

    5 利用成员函数复制文件的例子

    利用成员函数read()和wirte()复文件,函数原型如下:

    istream &read(char *p,sizeof(p));

    ostream &write(char *p,sizeof(p));

     1 #include <iostream>
     2 #include <fstream>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7 
     8     fstream in("e:\1.png",ios::in | ios::binary);
     9     if(!in.is_open())
    10     {
    11         cerr<<"源文件不存在"<<endl;
    12         exit(EXIT_FAILURE);
    13     }
    14     fstream out("e:\2.png",ios::out | ios::binary);
    15     if(!out.is_open())
    16     {
    17         cerr<<"路径错误"<<endl;
    18         exit(EXIT_FAILURE);
    19     }
    20     in.seekg(0,ios::end);
    21     long size;
    22     size = in.tellg();
    23     char *buf = new char[size];
    24     in.seekg(ios::beg);
    25     in.read(buf,size);
    26     out.write(buf,size);
    27     delete [] buf;
    28     cout<<"文件复制成功"<<endl;
    29     return 0;
    30 }

    复制大文件时buf不应该开辟太大,可以分段复制,比如:

     1 const int bufsize = 1024;
     2     char buf[bufsize];
     3     in.seekg(0,ios::end);
     4     long size;
     5     size = in.tellg();
     6     in.seekg(ios::beg);
     7 
     8     while(!in.eof())
     9     {
    10         in.read(buf,bufsize);
    11         out.write(buf,bufsize);
    12     }
    
    
  • 相关阅读:
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(13) 线程安全接口和双检查加锁优化
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(15) 监视器对象
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(8) 主动器
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(6) 扩展接口
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(12) 策略化加锁
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(10) 接受器 连接器
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(11) 同步模式与定界加锁
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(7) 事件处理模式与反应器
    《面向模式的软件体系结构2用于并发和网络化对象模式》读书笔记(14) 并发模式和主动对象
    Ubuntu 12.04开机默认启动IBus Anny
  • 原文地址:https://www.cnblogs.com/raichen/p/4350664.html
Copyright © 2020-2023  润新知