c++文件处理
1.文件分类
按照文件的存取方式分
顺序文件:结构简单,文件中的数据按顺序存放。在顺序文件中,只知道第一条记录的存放位置。当要查找某条记录时,只能从文件头开始,按顺序查找,直到找到为止。
随机文件:又称直接存取文件,简称随机文件或直接文件。随机文件的每条记录都 有一个记录号,即在写入数据时,只要指定记录号,就可以把数据写到指定的位置。在读取文件时,只要给出记录号,就可以直接读取。
按照数据编码方式分
文本文件:是按ASCII码进行编码的文件,可以用字处理软件建立和修改(必须以纯文本文件保存)
二进制文件:顾名思义,以按二进制编码的文件,不能用普通的字处理软件编辑,占空间较小。
1.1 文件操作的过程
用户程序在处理文件时,只需遵从如下的步骤即可:
1)打开文件。
2)读取文件。
3)处理数据。
4)写回(根据需要)
5)关闭文件。
1.2 处理文件流的类
在C中,处理文件必须通过一个结构体FILE。这个结构体的主要内容就是文件名、文件起始位置、大小、当前读写位置信息等信息。在处理文件的过程中,用户程序必须要通过这个结构体进行。如果打开文件 用fopen()函数、读数据的fprintf()函数、关闭文件的fclose()函数等。
例如:
[cpp]
#include<iostream>
using namespace std;
int main()
{
FILE *pFile=fopen("a.txt","r+");//以读写方式打开文件
if(NULL == pFile)//文件是否存在
{
cout<<"打开文件失败"<<endl;
system("pause");
return 0;
}
char str[256];
while(EOF!=fscanf(pFile,"%s",str))//读取文件内容,以空格或者回车分隔
{
cout<<str<<endl;//输出一行
}
fprintf(pFile,"END");//在文件尾部写入"END"
fclose(pFile);//关闭文件
system("pause");
return 0;
}
写完后文档内容如下:
事实上,通过FILE结构对文件进行操作并不是很理想。主要是因为这么做并不符合面向对象的思想。因此,c++提供了一系列专门用于处理文件的文件流类。这些类包括专门用于从文件中输入数据的ifstream类,专门用于向文件输出数据的ofstream类,以及即可输入也可以输出的fstream类。
需要注意的是,文件编码有ASCII码和UNICODE编码之分,相应的处理文件的类也有这样的分别。上述的ifstream、ofstream和fstream类都是用于处理ASCII编码的文件。如果要处理UNICODE编码的文件,则应当使用对应的wifstream、wofstream和wfstream。以下只针对ASCII码格式的文件流类进行说明。
文件流例1:
[cpp]
#include<iostream>
#include<fstream>
//#include<cstdlib>
//#include<cstdio>
//#include<stdio.h>
using namespace std;
int main()
{
fstream file;
file.open("a.txt");//没有指定打开方式,默认是读写。
if ( file.fail() )
{
cout<<"打开文件失败"<<endl;
system("pause");
return 0;
}
char str[256];
while(file>>str)
{
cout<<str<<endl;
}
file << "fstream";//没有写进去,为什么????
file.close();
system("pause");
return 0;
}
2.文件的打开与关闭
首先是创建流,然后把流和文件关联,才能进行输入、输出操作,完成后要关闭文件。
三个输入输出流类:ofstream,ifstream,fstream.
2.1打开文件
打开文件就是用函数open()把某一个流与文件建立联系。open()函数是上述三个流类的成员函数,定义在fstream.h中,它的原型为
void open(const unsigned char * ,int mode,int access=filefuf::openprot);
其中,第一个参数为字符串类型,其用来传递文件名。第二个参数是int型,其值决定文件撕开的方式,用数据流基类ios_base的数据成员指定。一般来讲每种流都有固定的打开模式。如输入文件流ifstream就是ios_base::in,输出文件流ofstream就是ios_base::out。即便是编程时给错了打开方式也不会出问题。
例如:构造输入文件流对象时,用的打开模式却是ios_base::out。这种情况下并不会影响文件的读入。同时也不要企图向文件中写入数据,因为输入文件流ifstream没有输出函数。第三个参数的值决定文件的访问方式及文件的类别,默认方式是filebuf::openprot。在DOS/Windows环境中,access的值分别对应DOS/Windows的文件属性代码如下:
[cpp]
0 普通文件
1 只读文件
2 隐含文件
3 系统文件
8 备份文件
例2:在当前文件夹下创建一个文本文件,并向其中写入一个字条串。
[cpp]
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream sfile("sssfile.txt");
sfile<<"Hello world"<<endl;
system("pause");
}
例3:创建一个文件,然后打开该文件,如果文件不存在,则返回错误信息;否则提示文件已打开的信息。
[cpp]
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream ofile("file1.txt");
ifstream ifile;
ofile<<"welcome to China";
ifile.open("file1.txt");
if(ifile.fail())
cout<<"文件不存在,打开失败!"<<endl;
else
cout<<"文件已打开,可以进行读写操作"<<endl;
ifile.close();
system("pause");
return 0;
}
2.2关闭文件
文件使用后,必须将其关闭,否则可能导致数据丢失。关闭文件就是将文件与流的联系断开,用函数close()完成,它也是流类中的成员函数,没有参数,没有返回值,其参数原型为:
对象名.close()
例:下面程序用open()函数打开一个文件,并判断其是否打开,但不管其是否打开成功,在程序结束时均需要关闭文件。
[cpp]
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream in;
in.open("file1.txt");
if (in.fail())
cout<<"文件不存在,打开失败"<<endl;
else
cout<<"文件已打开,可以进行读写操作"<<endl;
in.close();
cout<<"文件已关闭"<<endl;
system("pause");
return 0;
}
fail()函数是流类中的成员函数,可用该函数测试文件是否存在。若存在,返回0,否则返回非0。
在程序语句中,可将定义流与打开文件用一条语句完成,如:
[cpp]
#include <fstream.h>
#include <iostream>
using namespace std;
int main()
{
// fstream f("testf.txt",ios::in|ios::out);//如果只是fstream f("testf.txt");不会创建文件。要如此行代码或者fstream f(&
补充:软件开发 , C++ ,