1 文件和流
-- 可以将顺序文件看做一个有限字符构成的顺序字符流,然后像对cin, cout一样的读写
-- ios --> istream --> ifstream:从文件中读取数据的流
-- ios --> ostream --> ofstream:向文件中写入数据的流
-- fstream:既可以读一个文件,也可以写一个文件
2 创建文件
-- #include <fstream> // 包含头文件
-- ofstream outFile("clients.dat", ios::out|ios::binary); // 在构造函数中将文件创建出来
- clients.dat:要创建文件的名字
- ios::out // 文件打开方式
ios::out // 输出到文件,删除原有内容
ios::app // 输出到文件,保留原有内容,总是在尾部添加
- ios::binary // 以二进制文件格式打开文件
-- 也可以先创建ofstream对象,再用open函数打开
ofstream fout;
fout.open("test.out", ios::out|ios::binary);
-- 判断打开是否成功
if(!fout)
{
cout << "File open error!" << endl;
}
-- 文件名可以给出绝对路径,也可以给出相对路径。没有交代路径信息,就是在当前文件夹下找文件
3 文件名的绝对路径和相对路径
-- 绝对路径
“c:\\tmp\\mydir\\some.txt”
-- 相对路径
“\\tmp\\mydir\\some.txt” // 当前盘符的根目录下的tmp\dir\some.txt
"tmp\\mydir\\some.txt" // 当前文件夹的tmp的子文件夹里面的......
"..\\tmp\\mydir\\some.txt" // 当前文件夹的父文件夹下面的tmp子文件夹里面的......
"..\\..\\tmp\\mydir\\some.txt" // 当前文件夹的父文件夹下面的tmp子文件夹里面的......
4 文件的读写指针
-- 对于输入文件,有一个读指针
-- 对于输出文件,有一个写指针
-- 对于输入输出文件,有一个读写指针
-- 标识文件操作的当前位置,该指针在哪里,读写操作就在哪里进行
5 文件的写指针
ofstream fout("a1.out", ios::app); // 以添加的方式打开
long location = fout.tellp(); // 取得写指针的位置
location = 10;
fout.seekp(location); // 将写指针移动到第10个字节处
fout.seekp(location, ios::beg); // 从头数location
fout.seekp(location, ios::cur); // 从当前位置数location
fout.seekp(location, ios::end); // 从尾部数location
注意:location可以为负值
6 文件的读指针
ifstream fin("a1.in", ios::ate); // 打开文件,定位文件指针到文件尾,意义在于可以取文件的长度
long location = fin.tellg(); // 取得读指针的位置,也就是文件长度
location = 10L;
fin.seekg(location); // 将读指针移动到第10个字节处
fin.seekg(location, ios::beg); // 从头数location
fin.seekg(location, ios::cur); // 从当前位置数location
fin.seekg(location, ios::end); // 从尾部数location
注意:location可以为负值
7 字符文件读写
-- 因为文件流也是流,所以流的成员函数和流操作算子也同样适用于文件流
-- 写一个程序,将文件in.txt里面的整数排序,输出到out.txt
eg: 如果in.txt的内容为: 1 234 9 45 6 879
则执行本程序后,生成的out.txt的内容为: 1 6 9 45 234 879
案例(见本工程zifuwenjianduxie.cpp)
/**
* 演示字符文件读写
*
* 写一个程序,将文件in.txt里面的整数排序,输出到out.txt
*/
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v; // 可变长数组
ifstream srcFile("text.txt", ios::in); // 因为它是纯文本文件,不需要以二进制方式打开
ofstream destFile("out.txt", ios::out);
int x;
// cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符
while(srcFile >> x)
{
// cout << x << endl;
v.push_back(x); // 将x加到数组v中
}
sort(v.begin(), v.end()); // 将数组v进行排序
for(int i = 0; i < v.size(); i++)
destFile << v[i] << " ";
// 关闭文件
destFile.close();
srcFile.close();
return 0;
}