Unix/C/C++--文件读写详解
1 介绍
1.1 读写简介
在对文件进行读写操作之前,先要打开文件。打开文件有以下两个目的:
- 通过指定文件名,建立起文件和文件流对象的关联,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。
- 指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。
打开文件可以通过以下两种方式进行:
- 调用流对象的 open 成员函数打开文件。
- 定义文件流对象时,通过构造函数打开文件。
关闭文件时,调用文件流对象的 close 成员函数即可。
1.2 iostream 标准库与 fstream 标准库对比
- iostream 标准库,提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。
- fstream 标准库,提供了从文件读取流和向文件写入流
1.3 细节介绍
- 头文件
#include <iostream>
#include <fstream>
- ofstream: 写操作(输出)的文件类 (由ostream引申而来)
- ifstream: 读操作(输入)的文件类(由istream引申而来)
- fstream: 可同时读写操作的文件类 (由iostream引申而来)
2 图解
3 流程
3.1 打开文件
3.1.1 open函数介绍
- open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。
void open(const char *filename, ios::openmode mode);
- ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:[只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。]
3.1.2 open函数调用方式
- 方式1
类ofstream, ifstream 和 fstream 创建对象,对象调用成员函数open()5
ofstream outfile;
outfile.open("file.txt", ios::out | ios::trunc );
- 方式2
构造时,调用open函数。
由于对类ofstream, ifstream 和 fstream 的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用open 函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作:
ofstream outfile("file.txt", ios::out | ios::app);
3.1.3 is_open函数
bool is_open();
它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假( false )则相反。
3.2 关闭文件
3.2.1 close函数介绍
close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员
ofstream outfile;
outfile.open("file.txt", ios::out | ios::trunc );
outfile.close();
3.3 写入文件
在 C++ 编程中,我们使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里您使用的是 ofstream 或 fstream 对象,而不是 cout 对象。
3.4 读取文件
在 C++ 编程中,我们使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里您使用的是 ifstream 或 fstream 对象,而不是 cin 对象。
3.5 获得和设置流指针(get and put stream pointers)
-
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。
ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。
fstream, 类似 iostream, 同时继承了get 和 put -
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
3.5.1 例子
file.seekg( n ); // 定位到 file 的第 n 个字节
file.seekg(0,ios::beg); //让文件指针定位到文件开头
file.seekg(0,ios::end); //让文件指针定位到文件末尾
file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节
file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节
file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置
注意:移动的单位是字节,而不是行。
4 示例
4.1 from runoob
#include <fstream>
#include <iostream>
using namespace std;
int main ()
{
char data[100];
// 以写模式打开文件
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// 向文件写入用户输入的数据
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// 再次向文件写入用户输入的数据
outfile << data << endl;
// 关闭打开的文件
outfile.close();
// 以读模式打开文件
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// 在屏幕上写入数据
cout << data << endl;
// 再次从文件读取数据,并显示它
infile >> data;
cout << data << endl;
// 关闭打开的文件
infile.close();
return 0;
}
4.2 博主
待加
参考
1、C++文件读写详解(ofstream,ifstream,fstream)
2、C++文件操作详解(ifstream、ofstream、fstream)
3、C++读写TXT文件中的string或者int型数据以及string流的用法
4、c++文件操作
5、C++对文件进行读写操作
6、C++ 文件和流
7、C++ open 打开文件(含打开模式一览表)
8、文件操作(FILE)与常用文件操作函数——C语言