zoukankan      html  css  js  c++  java
  • C++文件操作

    文件的操作

    文件的打开方式

    • 定义文件流对象时使用带参数的构造函数;
    • 调用文件流成员函数open;

    文件流定义在std的命名空间中,因此在使用文件流的时候要和使用cin、cout输入输出流一样,用using指令声明使用的命名空间。

    文件的打开方式openmode

    取值 含义 作用
    ios_base::in input 以输入的方式打开文件
    ios_base::out output 以输出的方式打开文件,若该文件已存在,则将其内容全部清空
    ios_base::app append 以输出的方式打开文件,写入数据添加在文件末尾
    ios_base::ate at end 打开一个已有的文件,文件指针指向文件末尾
    ios_base::binary binary 二进制文件,默认为ASCII文件
    ios_base::trunc truncate 打开一个文件,若文件已存在,则将其内容全部清空;若文件不存在,则建立新文件。若指定了ios::out方式而未指定ios::app、ios::ate、ios::in时,默认为此方式

    文件流相关的函数

    ifstream();	//文件输入流构造函数
    ifstream(const char* filename ,ios_base::openmode mode = ios_base::in);
    ofstream(); //文件输出流构造函数
    ofstream(const char* filename ,ios_base::openmode mode = ios_base::out);
    fstream();	//文件输入输出流构造函数
    fstream(const char* filename ,ios_base::openmode mode = ios:;base::in|ios_base::out);
    //使用成员函数open打开文件
    void open(const char* filename ,ios_base::openmode mode = ios_base::in);
    bool is_open();	//检测文件是否打开
    

    说明

    1. 可以用位或运算对openmode进行组合;
    2. 打开文件操作若失败,open函数的返回值为0(假)。如果是调用构造函数打开文件且打开操作失败,则流对象的值为0(空对象);
    3. 每一个打开的文件都有一个文件指针,该指针初始位置要么在文件末尾(当指定ios_base::app或ios_base::ate时),要么在文件开头。每次读写都从文件指针的当前位置开始,每读写一个字节,指针就自动后移一个字节,当文件指针移到最后,就会遇到文件结束EOF(文件结束符)。

    文件的关闭:文件关闭调用文件流成员函数void close();

    文件的状态

    文件的状态可以通过文件流的四个成员函数来检测

    成员函数 描述
    bool eof() 文件到达末尾,eof函数返回为真,否则返回为假
    bool bad() 如果在读写文件过程中出错,返回为true,如:对一个不是为写入状态打开的文件进行写入,或者要写入的设备没有了剩余空间
    bool fail() 除了遇到与bad函数同样的情况会返回true外,格式错误时,fail函数也会返回true,比如:要读入一个整数而得到一个字母时。
    bool good() 如果调用以上任何一个函数返回true的话,good函数将返回false;

    二进制的文件读写

    二进制文件读写主要使用read()和write()函数;

    //用于文件输入流
    istream& read(char*s ,streamsize n); //从文件中读取n字节到s中
    streampos tellg();	//返回文件指针的位置
    istream& seekg(streampos pos);	//移动文件指针到pos位置
    istream& seekg(streamoff off, ios_base::seekdir dir);	//以dir参照off偏移移动文件指针
    
    //用于文件输出流
    ostream& wirite(const char* s, streamsize n);	//输出s的n个字节到文件中
    streampos tellp();	//返回文件指针的位置
    ostream& seekp(streampos pos);	//移动文件指针到pos位置
    ostream& seekp(streamoff off , ios_base::seekdir dir);	//以dir参照off偏移移动文件指针
    flush();	//	文件输出流刷新
    

    程序对二进制文件的读写结果文件,用普通方式打开,显示的是乱码,但这并不重要,只要按照程序写入的格式读取,可以重新输出为文本文件!

    二进制文件读写操作示例:

    /*将一个book.dat的文件数据读取后用二进制的方式写入到另一个文件,需要注意编码格式C++似乎对unicode编码支持不友好,读取的文件若是编码格式不对,将会读入垃圾数据*/
    
    #include <iostream>
    #include <fstream>
    using namespace std;
    struct Book {
    	char c[5], n[11];	//产品代码、产品名称
    	int price, count;	//产品单价,产品数量
    };
    int main() {
    	Book a;
    	ifstream inf("book.dat");
    	ios::openmode m = ios::in | ios::out;	//定义一个可读可写的参数变量用于mode组合使用
    	fstream ouf("out.dat", m | ios::trunc | ios::binary);
    	if (inf.fail() || ouf.fail())	return -1;	//文件打开失败退出运行
    	while (!inf.eof()) {
    		inf >> a.c >> a.n >> a.price >> a.count;
    		ouf.write(reinterpret_cast<const char*> (& a), sizeof(Book));	//写二进制文件
    	}
    	inf.close();
    	ouf.seekg(2 * sizeof(Book), ios::beg);	//定位第3个结构体
    	cout << a.c << a.n << a.price << a.count << endl;
    	ouf.close();
    	return 0;
    }
    
  • 相关阅读:
    【深入学习MySQL】MySQL的索引结构为什么使用B+树?
    【Python爬虫】爬了七天七夜,终于爬出了博客园粉丝数排行榜!
    【BAT面试题系列】面试官:你了解乐观锁和悲观锁吗?
    深入学习MySQL事务:ACID特性的实现原理
    深入学习Redis(5):集群
    深入学习Redis(4):哨兵
    谈谈微信支付曝出的漏洞
    深入学习Redis(3):主从复制
    深入学习Redis(2):持久化
    Spring中获取request的几种方法,及其线程安全性分析
  • 原文地址:https://www.cnblogs.com/coro/p/13211445.html
Copyright © 2011-2022 走看看