c++文件处理(二)

2014-11-24 10:10:31 · 作者: · 浏览: 1

using namespace std;
int main()
{
// fstream f("testf.txt",ios::in|ios::out);//如果只是fstream f("testf.txt");不会创建文件。要如此行代码或者fstream f("testf.txt",ios::out)
ofstream f("testf.txt",ios::out);//ofstream默认就是out.所以ofstream f("testf.txt")与本行代码一个效果
f<<"helloworld"< system("pause");
}
一般情况下,ifstream和ofstream流类的析构函数就可以自动关闭已打开的文件,但若需要使用同一个流对象打开的文件,则需要首先用close()函数关闭当前文件。
3.文件的顺序读写
3.1读写文本文件
对文本文件进行读写时,先要以某种方式打开文件,然后使用运算符“<<”和">>"进行操作,同时必须将运算符"<<"和">>"前的cin和cout与文件关联的流代替。
下面程序先向文件test.txt中写入三行数据,再将该文件打开,并将写入的数据依次输出到屏幕。
[cpp]
#include
#include
using namespace std;
int main()
{
ofstream fout("test.txt");
if (!fout)//创建失败
{
cout<<"不能打开输出文件。"< return 1;
}
fout<<"HelloWorld"< fout<<10< fout< fout.close();
ifstream fin("test.txt");
if (!fin)
{
cout<<"不能打开输入文件"< return 1;
}
char c[20];
int i;
char ch;
fin>>c;
fin>>i;
fin>>ch;
cout< cout< cout< fin.close();
system("pause");
return 0;
}


例:下面程序实现对一个文本文件的多种操作,包括求文件长度、统计单词长度等功能。
[cpp]
#include
#include
using namespace std;
void open(char str[])//打开文件函数,把文件内容传给str;
{
int i=0;
ifstream f;
f.open("test.txt",ios::in);//ifstream默认就是ios::in,此处可以省略
if (!f)
{
cout<<"not open"< return ;
}
while (f)
{
f.get(str[i]);//一个一个取字符,包括空格。可参见myblog:cin\cin.get()\cin.getline()\getline()\gets()\getchar()用法集锦
i++;
}
str[i]='\0';//在读到的字符串最末加上'\0'。
f.close();
cout< }

int len(char str[])//求字符串长度函数
{
int temp=0;
for(int i=0;'\0'!=str[i];i++)
temp++;
return temp;
}

int index(char a[],char b[])//找子串函数,返回子串首次出现的位置。
{
int i,j,temp;
for(i=0;i

{
temp=i;
j=0;
while(j<=len(b)&&a[temp]==b[j])//对i位置及后面的字符,逐个字符判断是否字串
{
temp++;
j++;
}
if(j==len(b))//找到
return i;
}
return -1;
}

int count(char str[])//统计单词个数
{
int i,c=0;
for(i=0;i if(' '==str[i])
c++;
return c+1;//以单词之间空格个数+1表示单词个数。比如3个单词间有2个空格。
}

void output(char a[])//输出当前文本
{
for(int i=0;i cout< cout< }

void output(char a[],int)//输出第一个单词
{
for(int i=0;i if(' '==a[i])
break;
else
cout< cout< }

int main()
{
char m[100];
char n[]="ok";
open(m);
cout<<"字符串长度:"< cout<<"目标单词首次出现的位置:"< cout<<"单词数:"< cout<<"当前文本是:"< output(m);//输出当前文本
cout<<"第一个单词是:";
output(m,1);//输出第一个单词
system("pause");
return 0;
}


3.2读写二进制文件
二进制文件是一种不能用普通的字处理软件进行编辑、占空间较小的文件。二进制文件与文本文件的区别有以下几点:
1)文本文件是字符流,二进制文件是字节流。
2)文本文件在输入时,将回车和换行两个字符转换为字符"\n",输出是将字符"\n"转换为回车和换行两个字符,二进制文件不做这种转换。
3)文本文件遇到文件结束符时,用get()函数返回一个文件结束标志EOF,该标志的值为-1。二进制文件用成员函数eof()判断文件是否结束。其中,eof()函数的原型为:int eof();
4)当文件达到末尾时,返回一个非零值;未达到末尾时返回零值。当从键盘输入字符时,结束符为+z组合键。
任何文件,都能以文本方式或者二进制方式打开。对以二进制方式打开的文件,有两种方式进行读写操作:一种是使用函数get()和put(),另一种是使用函数read()和write()。
3.2.1使用get()和put()读写二进制文件
get()函数是输入流类istream中定义的成员函数,作用是从与流对象连接的文件中读出数据,get()实现的功能是从流中每读出一个字节或一个字符放入引用&ch中,返回一个流输入对象值。在c++中,get()函数原型为:
istream &get(unsigned char &ch);
put()函数是输出流类ostream中定义的成员函数,作用是向与流对象连接的文件中写入数据,put()实现的功能是每次将一个字节或一个字符写入流中,同时返回一个流输入对象值。在c++中,put()函数的原型为:
istream &put(char ch);
get()函数和put()函数都只能对单个字符或者单个字节进行操作,如果需要实现多字符的操作,可通过循环语句来实现。
例如,下面程序用函数get()和put()读写二进制文件。该程序定义一个命令,在DOS下调用该命令可以实现将文件1的内容拷贝到文件2中,相当于DOS命令中的copy命令。
[cpp]
#include
#include
using namespace std;
int main(int arg,char *argv[])
{
char ch;
if(arg!=3)
{
cout<<"命令行输入错误!"< return 1;
}
ifstream fin(argv[1]);//定义输入流对象,打开第二个参数中的文件
if(!fin)
{
cout<<"不能打开源文件"< return