C++文件读写(ifstream、ofstream)

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

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

[cpp]  view plain  copy
  1. ofstream out;  
  2. out.open("Hello.txt", ios::in|ios::out|ios::binary)                 //根据自己需要进行适当的选取  
  1. ofstream out("...", ios::out);  
  2. ifstream in("...", ios::in);  
  3. fstream foi("...", ios::in|ios::out);  

文件操作:
打开文件
  文件名
    注意路径名中的斜杠要双写,如:
    "D:\\MyFiles\\ReadMe.txt"
  文件打开方式选项:
    ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
    ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
    ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
    ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
    ios::trunc   = 0x10, //在读写前先将文件长度截断为0(默认)
    ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
    ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
    ios::binary  = 0x80  //二进制格式文件
  文件保护方式选择项:
    filebuf::openprot;   //默认的兼容共享方式
    filebuf::sh_none;    //独占,不共享
    filebuf::sh_read;    //读共享
    filebuf::sh_write;   //写共享
  打开文件的方法
    调用构造函数时指定文件名和打开模式
    ifstream f("d:\\12.txt",ios::nocreate);         //默认以 ios::in 的方式打开文件,文件不存在时操作失败
    ofstream f("d:\\12.txt");                //默认以 ios::out的方式打开文件
    fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以读写方式打开二进制文件
    使用Open成员函数
    fstream f;
    f.open("d:\\12.txt",ios::out);       //利用同一对象对多个文件进行操作时要用到open函数

1.写入文件:

使用重载的插入操作符<< 

  1.  // writing on a text file  
  2.  #include   
  3.  int main () {  
  4.      ofstream out("out.txt");  //打开文件用于写,若文件不存在就创建它
  5.      if (out.is_open())   
  6.     {  
  7.          out << "This is a line.\n";  
  8.          out << "This is another line.\n";  
  9.          out.close();  
  10.      }  
  11.      return 0;  
  12.  }  
  13. //结果: 在out.txt中写入:  
  14. This is a line.  
  15. This is another line 

2.从文件中读入数据:

[cpp]  view plain  copy
  1. // reading a text file  
  2.    #include   
  3.    #include   
  4.    #include   
  5.      
  6.    int main () {  
  7.        char buffer[256];  
  8.        ifstream in("test.txt");  
  9.        if (! in.is_open())  
  10.        { cout << "Error opening file"; exit (1); }  
  11.        while (!in.eof() )  
  12.        {  
  13.            in.getline (buffer,100);  
  14.            cout << buffer << endl;  
  15.        }  
  16.        return 0;  
  17.    } 

eof():如果读文件到达文件末尾,返回true。

3.二进制文件

在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。

文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:

write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );

这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。

  1. // reading binary file  
  2.     #include   
  3.     #include   
  4.       
  5.     const char * filename = "test.txt";  
  6.       
  7.     int main () {  
  8.         char * buffer;  
  9.         long size;  
  10.         ifstream in (filename, ios::in|ios::binary|ios::ate);  
  11.         size = in.tellg();  
  12.         in.seekg (0, ios::beg);  
  13.         buffer = new char [size];  
  14.         in.read (buffer, size);  
  15.         in.close();  
  16.           
  17.         cout << "the complete file is in a buffer";  
  18.           
  19.         delete[] buffer;  
  20.         return 0;  
  21.     }  
  22.     //运行结果:  
  23.     The complete file is in a buffer  
读写操作
   使用<<,>>运算符
  只能进行文本文件的读写操作,用于二进制文件可能会产生错误。
   使用函数成员 get、put、read、write等
  经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。
读写二进制文件注意事项
  打开方式中必须指定ios::binary,否则读写会出错
  用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。
  使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数
关闭文件
   使用成员函数close ,如:
  f.close(); 
   利用析构函数
  对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。
拷贝文件
//二进制文件操作示例

#include
void main()
{
  ifstream fin("C:\\1.exe",ios::nocreate|ios::binary);
  if(!fin){
    cout<<"File open error!\n";
    return;
  }
  ofstream fout("C:\\2.exe",ios::binary);
  char c[1024];
  while(!fin.eof())
  {
    fin.read(c,1024);
    fout.write(c,fin.gcount());
  }
  fin.close();
  fout.close();
  cout<<"Copy over!\n";
}

你可能感兴趣的:(C++文件读写(ifstream、ofstream))