目录
- 文件基本概念
- 文件I/O
- 文件顺序读写与随机文件读写
- 文件的打开与关闭
- 文本文件处理
- get(), getline(), put()函数
- 其他操作
一、文件基本概念
文件可以看作是一个连续的字符串集合,该字符串集合没有大小
字符串是以流的形式存在,文件也可以看作是一个流的集合,称为流式文件
文件可以看作将信息集合到一起存储的格式,通常存储在计算机的外部存储介质
使用文件有点:
1)文件可以使一个程序对不同的输入数据进行加工处理,并产生相应的输出结果
2)使用文件可以方便用户,提高上机效率
3)使用文件可以不受内存大小限制
二、文件I/O
C++标准库中,文件I/O操作有丰富的类,这些类都由一个抽象类作基类,然后这些抽象类派生出具体的实现类。
C++中对文件进行操作分为如下步骤:
1 建立文件流对象
2 打开或建立文件
3 进行读写操作
4 关闭文件
文件I/O操作的三个流类
1 fstream(输入输出文件流)
2 ifstream(输入文件流)
3 ofsream(输出文件流)
以上三个类都包含在fstream头文件中。程序对文件操作,必须包含该头文件。
ifstream对象如果重复使用,需注意使用前,先调用clear函数,否则会报错。
fstream案例
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//在当前工程目录test06下,建立com.txt
void fstreamEx()
{
char buffer[256];
fstream out;
out.open("com.txt", ios::in);
cout << "com.txt的内容如下:"<< endl;
while(!out.eof())//eof end of file 判断是否到文件结尾
{
//getline(char*, int, char)表示该行字符达到256个或遇到换行符就结束
out.getline(buffer, 256, '\n');
cout << buffer << endl;
}
out.close();
//cin.get()是用来读取回车键的,如果没这一行
//输出的结果一闪就消失
//cin.get();
}
void main()
{
fstreamEx();
system("pause");
}
ifstream案例
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//测试ifstream
int CountLines(char *filename)
{
ifstream readFile;
int n = 0;
char line[512];
string temp;
//ios::in表示以只读方式读取文件
readFile.open(filename, ios::in);
//文件打开失败,返回true
if(readFile.fail())
{
return 0;
}
else//文件存在
{
while(getline(readFile, temp))
{
n++;
}
return n;
}
readFile.close();
}
void ifstreamEx()
{
cout << "com.txt的行数为: " << CountLines("com.txt") << endl;
}
void main()
{
ifstreamEx();
system("pause");
}
ofstream案例
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void ofstreamEx()
{
ofstream in;
//ios::trunc表示在打开文件前将文件清空
//由于写入,文件不存在则创建
in.open("com.txt", ios::trunc);
int i;
char a = 'a';
for(i = 1; i <= 26; i++)
{
if(i < 10)
{
in << "0" << i << "\t" << a << "\n";
a++;
}
else
{
in << i << "\t" << a << "\n";
a++;
}
}
in.close();
}
void main()
{
ofstreamEx();
system("pause");
}
三、文件顺序读写与随机文件读写
顺序读写:
在C++文件中,每条记录是一个接着一个存储的,如果想查找一条记录,则必须从文件的开头逐一读取文件的记录,直到找到该条记录的位置。
随机文件读写:
随机文件每个记录都有一个记录号,在读写数据时,只要指定记录号,就可以对数据进行读写。
随机文件读写案例
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int CountLines(char *filename)
{
ifstream readFile;
int n = 0;
string tmp;
readFile.open(filename, ios::in);
if(readFile.fail())
{
return 0;
}
else
{
while(getline(readFile, tmp))
{
n++;
}
return n;
}
readFile.close();
}
string ReadLine(char *filename, int line)
{
int lines, i = 0;
string temp;
fstream file;
file.open(filename, ios::in);
lines = CountLines(filename);
if(line <= 0)
{
return "error 1, 行数错误,不能为0或负数";
}
if(file.fail())
{
return "error 2, 文件不存在.";
}
if(line > lines)
{
return "error 3, 行数超出文件长度";
}
while(getline(file, temp) && i < line - 1)
{
i++;
}
file.close();
return temp;
}
void test01()
{
int l;
char filename[256];
cout << "请输入文件名: " << endl;
cin >> filename;
cout << "请输入要读取的行数: " << endl;
cin >> l;
cout << ReadLine(filename, l) << endl;
}
void main()
{
test01();
system("pause");
}
四、文件的打开与关闭
C++中,要进行文件的输入输出,必须创建一个流,把这个流与文件相关联,才能对文件进行操作,完成后要关闭文件。
文件的打开
1)fstream类中的open()成员函数
在fstream类中的open成员函数,用来打开文件。函数原型为:
void open(const char* filename, int mode, int access);
参数含义如下:
filename:要打开的文件名
mode:要打开文件的方式
access:打开文件的属性
打开文件的方式在类ios(是所有流式IO类的基类)中定义,常用值如下:
ios::app:以追加方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含此属性
ios::binary:以二进制方式打开文件,默认的方式是文本方式
ios::in:文件以输入方式打开
ios::out:文件已输出方式打开
ios::nocreate:不建立文件,所以文件不存在时,打开失败
ios::noreplace:不覆盖文件,所以文件存在时打开失败
ios::trunc:如果文件存在,把文件长度设为0.
可以用“或”把以上属性连接起来,如ios::out | ios::binary
打开文件的属性取值:
0 普通文件,打开访问
1 只读文件
2 隐含文件
3 系统文件
默认打开方式:
如果没有指定打开方式参数,编译器会使用默认值
fstream 无默认值
ifstream std::ios::in
ofstream std::ios::out | std::ios::trunk
文件的关闭
1 当文件读写操作完成后,必须将文件关闭,以使文件重新变为可访问。
2 关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。
3 关闭格式:void close();这个函数一旦被调用,原先的流对象就可以被用来打开其他文件,这个文件就可以重新被其他进程访问。
4 为防止流对象被销毁时还联系这打开的文件,析构函数将会自动调用关闭函数close.
五、文本文件处理
文本文件是以ASCII处理文件的,可以用字符处理软件来处理。文本文件的读写很简单,用插入运算符<<向文件输出,用析取运算符>>从文件输入。
将变量写入文件
void writeFile()
{
ofstream outfile;
outfile.open("a.txt");//
outfile << "锄禾日当午,汗滴禾下土";
outfile.close();
}
将变量写入文件尾部
void writeAppendFile()
{
ofstream outfile;
outfile.open("a.txt", ios::out | ios::app);
outfile << "谁知盘中餐,粒粒皆辛苦";
outfile.close();
}
从文本文件中读入变量
void readFile()
{
ifstream infile;
char value;
infile.open("com.txt");
if(infile.is_open())
{
//infile >> value
while(infile.get(value))
{
cout << value;
}
}
cout << endl;
infile.close();
}
六、get(), getline(), put()函数
get()
get函数是ifstream类的成员函数,作用是读取该类的对象的一个字符并且将之作为调用函数的返回值。get函数会自动向后读取下一个字符,直到遇到文件结束符,则返回EOF作为文件的结束。
void testGet()
{
ifstream infile;
char value;
infile.open("a.txt");
if(infile.is_open())
{
while(infile.get(value))
{
cout << value;
}
}
cout << endl;
infile.close();
}
getline(str, n, ‘\n’)
从文件读取字符存入字符串str中,直到读取n-1个字符或遇到”\n”时结束
void testGetLine()
{
char buffer[256];
ifstream infile("com.txt");
if(!infile.is_open())
{
cout << "error opening file";
exit(1);
}
while(!infile.eof())
{
infile.getline(buffer, 100);
cout << buffer << endl;
}
}
getline(str, n, ‘\n’)
put函数用于输出流ofstream, 输出单个字符
void testPut()
{
ofstream out("a.txt");//创建一个文件
out.put('A');
out.put('B');
out.close();
}
七、其他操作
get(c)从文件中读取一个字符,如果返回-1,则表示读取到文件末尾。
eof() 如果到文件末尾,返回true,否则返回false。
remove(const char* name),删除文件,成功返回true,否则返回false
peek():查找下一个字符,但不从文件中取出