C++中的文件操作

需要用到 C++ 中另一个标准库 fstream

数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示输入文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。
模式标志描述
ios::app追加模式。所有写入都追加到文件末尾。
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc

如果该文件已经存在,则先删除该文件

ios::binary二进制方式

 

零、终端,缓冲区,文件三者的关系

从键盘输入的字符存储到缓冲区

从文件读取的数据也存储在缓冲区

然后调用命令输出到终端上

平常说的输入输出,都是指缓冲区的输入输出,缓冲区是主体

 

一、fstream的成员函数

tellg() 和 tellp()

这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数(long类型),代表当前get 流指针的位置 或 put 流指针的位置,所谓位置其实就是距离文件开头的字节数

seekg() 和seekp()

这对函数分别用来改变流指针get 和put的位置。

  1. seekg ( off_type offset, seekdir direction );
  2. seekp ( off_type offset, seekdir direction );
  1.  ios::beg(默认的,从流的开头开始定位),
  2.  ios::cur(从流的当前位置开始定位),
  3.  ios::end(从流的末尾开始定位)。
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );
 
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );
 
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );
 
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );

bad()

  • 如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。

fail()

  • 除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。

eof()

  • 如果读文件到达文件末尾,返回true。

good()

  • 这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。

要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。

getline()

在<istream>库中的getline()函数有两种重载形式:

  • istream& getline (char* s, streamsize n );
  • istream& getline (char* s, streamsize n, char delim );

作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,

如果遇到delim 或 字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。

二进制文件则使用下面成员函数

  1. write ( char * buffer, streamsize size );
  2. read ( char * buffer, streamsize size );

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

清空缓冲区

cin.sync();                     //全部清空

cin.ignore(int , char );  //int形参表示最多删除多少字节,char形参表示遇到什么字符中断操作
 

二、文件操作过程

(1)打开文件

ofstream outfile;    //创建文件对象
outfile.open("file.dat", ios::out | ios::trunc );    | 表示多种模式结合
ofstream <文件对象>("文件名",模式);      //以输出方式创建文件对象 ,会自动关联到文件名

(2)关闭文件

<文件对象>.close();

(3)写入文件

<文件对象> << "This is a line.\n";

<文件对象> << "This is another line.\n";

(4)读取文件

while (!<文件对象>.eof())    //以行为单位进行循环
{
     <文件对象>.getline (buffer,100); 
     cout << buffer << endl;     //打印到终端上
}

(5)二进制文件读写


    int main () {
        char * buffer;
        long size;
        ifstream in (filename, ios::in|ios::binary|ios::ate);
        size = in.tellg();
        in.seekg (0, ios::beg);
        buffer = new char [size];
        in.read (buffer, size);
        in.close();
        
        cout << "the complete file is in a buffer";
        
        delete[] buffer;
        return 0;
    }

 

 

 

参考:

https://blog.csdn.net/kingstar158/article/details/6859379

 

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值