C++ 文件读写

Posted 我是小白呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 文件读写相关的知识,希望对你有一定的参考价值。

概述

所谓 “文件”, 一般指存储在外部介质上的数据的集合.
一批数据是以文件的形式存放在外部介质上的. 操作系统是以文件的单位对数据进行管理.
在这里插入图片描述

文件分类

按存储介质:

  • 磁盘文件
  • 光盘文件
  • U 盘文件

按用途:

  • 程序文件 (program file)
  • 数据文件 (data file)

按文件中数据的组织形式

  • ASCII 文件: 以 ASCII 表示的文件 (如 .txt, .cpp)
  • 二进制文件: 用二进制形式表示的文件 (如 .o, .exe)

文件流

文件流

  • 输出文件流是从内存流向外存文件的数据
  • 输入文件流是从外存文件流向内存的数据
  • 每一个文件流都有一个内存缓冲区与之对应

文件流 vs. 文件的:

  • 文件流本身不是文件, 是以文件为输入输出对象的流
  • 要对磁盘文件输入输出, 必须通过文件流来实现
  • 文件操作需要流对象, cout, cin 是已定义的流对象

流对象

在 C++ I/O 类库中专门用于文件操作的类:
在这里插入图片描述
要对文件输入输出, 必须定义一个文件流类的对象. C++ 是通过流对象进行输入输出的:

  • 在用标准设备为对象的输入输出中, cin, cout 是流对象
  • 文件操作也是要定义对象, 例如: ofstream outfile

打开文件

打开文件是指在文件读写之前必要的准备工作. 打开分拣为流对象和指定磁盘文件建立关联, 以便使文件流流向指定的磁盘文件, 指定文件的工作方式.

在这里插入图片描述
打开文件有两种不同方法, 调用 open 函数和调用文件流构造函数.

open 函数

调用文件流的成员函数 open, 如:

ofstream outfile;  // 定义输出文件流类对象
outfile.open(″f1.dat″,ios::out); 

构造函数

在定义文件流对象是调用文件流类的构造函数:

istream infile(″c:\\\\new\\\\f1.dat″, ios::in);

打开文件的方式

方式描述
ios::in供读, 文件不存在时, 打开失败
ios::out供写, 文件不存在则创建, 若文件已存在, 则清空内容
ios::ate文件打开时, 指针在文件最后. 可改变指针位置, 常和 in, out 联合使用
ios::app供写, 文件不存在则创建, 若文件已存在, 则在原文内容后添加写入新的内容
ios::trunc在读写前先将文件长度截断为 0
ios::nocreate文件不存在时产生错误, 常和 in 或 app 联合使用
ios::noreplace文件存在时产生错误, 常和 out 联合使用
ios::binary二进制格式文件

如果打开操作失败, open 函数的返回值为 0. 如果是调用构造函数的方式打开文件的, 则流对象的值为 0.

关闭文件

在对已打开的磁盘文件的续写操作完成后, 应该关闭该文件. 例如:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    int a[10];
    ofstream outfile("b.txt");  // 打开文件
    outfile << "Little White";  // 输出
    outfile.close();  // 关闭磁盘文件
    
    return 0;
}

输出结果:
在这里插入图片描述

ASCII 文件操作

ASCII 文件, 即字符文件. 文件中的每一个字节均以 ASCII 代码的形式存放, 即一个字节存放一个字符.

程序可以从 ASCII 文件中读取若干个字符, 也可以向它输出一些字符.

对 ASCII 文件的读写操作的方法:

  1. 用流插入运算符<<和流提取运算符>>输入输出标准类型的数据
  2. 用文件流的 put, get, getline 等成员函数进行字符串的输入输出

写入文件

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    int a[10];
    // 打开文件
    ofstream outfile("a.txt", ios::out);
    if(!outfile){
        cerr << "open error!" << endl;
        exit(1);  // 退出
    }
    
    // 操作文件
    cout << "enter 10 integer numbers:" << endl;
    for (int i = 0; i < 10; ++i) {  // 输入10次
        cin >> a[i];
        outfile << a[i] << " ";
    }
    
    // 关闭文件
    cout << "The numbers have been writen to file." << endl;
    outfile.close();

    return 0;
}

读取文件

从文件读取整数, 并输出数中最大的数已经序列号.

#include <fstream>
#include <iostream>
using namespace std;

int main() {
    int a[10], max, index;
    // 打开文件
    ifstream infile("a.txt", ios::in);
    if(!infile){
        cerr << "open error!" << endl;
        exit(1);  // 退出
    }

    // 操作文件
    for (int i = 0; i < 10; ++i) {  // 输入10次
        infile >> a[i];
        cout << a[i] << " ";
    }
    cout << endl;

    // 关闭文件
    cout << "The numbers have been read." << endl;

    // 取最大
    max = a[0];  // 初始化为第一个
    index = 0;
    for (int i = 0; i < 10; ++i) {
        if(a[i] > max){
            max = a[i];
            index = i;
        }
    }
    cout << "max= " << max << endl;
    cout << "index= " << index << endl;

    return 0;
}

输出结果:

1 3 5 4 6 8 4 2 1 2
The numbers have been read.
max= 8
index= 5

读写文件

从键盘读入一行字符, 把其中的小写字母字符依次存放在文件中. 再从文件中读出, 将其中的小写字母改为大写字母, 重新读入.

#include <fstream>
#include <iostream>

void get();
void set();

using namespace std;

int main() {
    set();
    get();

    return 0;
}

void set() {
    ofstream outfile("temp1.txt");
    if(!outfile) {
        cerr << "open temp1 error" << endl;
        exit(1);
    }
    char c[80];
    cin.getline(c,80);
    for(int i=0; c[i]!=0; i++)
        if(c[i]>='a' && c[i]<='z')
            outfile.put(c[i]);
    outfile.close();
}

void get() {
    char ch;
    ifstream infile("temp1.txt", ios::in);
    if(!infile) {
        cerr << "open temp1 error" << endl;
        exit(1);
    }
    ofstream outfile("temp2.txt");
    if(!outfile) {
        cerr << "open temp2 error" << endl;
        exit(1);
    }
    while(infile.get(ch)){
        outfile.put(ch - 32);
    }
    outfile.close();
    infile.close();
}

输出结果:
在这里插入图片描述
在这里插入图片描述

以上是关于C++ 文件读写的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

C++ 代码片段(积累)

C++文本文件操作和二进制文件读写

c++ 读写文件总结

这些 C++ 代码片段有啥作用?

linux下c通过虚拟地址映射读写文件的代码