目录
- 文件基本概念
- 文件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;
void fstreamEx()
{
char buffer[256];
fstream out;
out.open("com.txt", ios::in);
cout << "com.txt的内容如下:"<< endl;
while(!out.eof())
{
out.getline(buffer, 256, '\n');
cout << buffer << endl;
}
out.close();
}
void main()
{
fstreamEx();
system("pause");
}
ifstream案例
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int CountLines(char *filename)
{
ifstream readFile;
int n = 0;
char line[512];
string temp;
readFile.open(filename, ios::in);
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;
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())
{
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():查找下一个字符,但不从文件中取出
|