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;
}

原文链接: https://www.cnblogs.com/coro/p/13211445.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++文件操作

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/360699

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午1:27
下一篇 2023年3月2日 下午1:27

相关推荐