文件操作

来源:互联网 发布:ubuntu怎么安装jdk 编辑:程序博客网 时间:2024/05/02 04:58

1.指向常量的指针:

Char ch[5]=”lisi”;

我们先定义了一个字符数组,它有五个元素。要注意这种赋值形式只能在数组定义的同时进行。

这里为什么是5不是4你呢?

对于常量字符串来说会自动加上一个/0,所以我们要定义5个元素的字符数组才能存放这个常量字符串。

 

利用pStr去修改它所指向的内存:

*pStr=’w’;  //error

在编译的时候就会报错。因为我们这里定义的是指向常量的指针变量,那么它指向的对象是常量,不能够改变它的内容。

pStr=”wangwu”;  //OK

用一个常量字符串给这个指针变量进行赋值,这个操作就相当于将这个常量字符串的地址赋给了这个变量。那么pStr这个内容本身是可以修改的,也就是这个指针值是可以修改的,所以这个操作是允许的。

 

要注意虽然我们不能利用这个pStr去修改它所指向的这个内容,但是对于这个字符数组来说我们仍然可以利用字符数组去改变内存当中的数据内容。要注意这里面的区别。

那么我们将pStr声明为指向常量的指针,这个在编译的时候就保证了不能够利用这个指针变量去修改它所指向的内容。

 

总结:我们通常在定义一个函数的时候,我们如果想用这个指针作为传参,通常会将形参声明为指向常量的指针类型。这样的话当实参传进了之后,因为形参的类型是指向常量的指针类型,所以我们就不能够利用形参去修改它所指向的内容。从而保证了数据的一致性。

 

2.指针常量:

char ch[5]=”lisi”;

char *const pStr=ch;   //定义了一个指针常量,我们用字符数组给这个指针常量赋值,相当于是将字符的首地址赋给了指针常量。要注意的是对于“指针常量”来说,必须在定义的同时进行初始化。而对于“指向常量的指针”,可以先定义,在下一句代码中赋值。

指针常量表示指针本身是常量,也就是说,对于pStr的值来说它是一个地址值,也就是一个指针值,是不可修改的,但是对于pStr它所指向的内容却是可以修改的。

pStr=”zhangsan”;   //error  //用一个常量的字符串给pStr进行赋值,相当于是把它的地址赋给它,但是,指针值是不可修改的,所以这个操作是错误的。

*pStr=’w’;         //ok

//我们用*号取值,修改pStr它所指向的内存的第一个字节的字符的内容,我们想将它改为’w’,这个操作是可以的。因为我们所定义的指针常量它所指向的内容是可以修改的,指针本身是常量。

总结:对于“指向常量的指针”表明它所指向的对象是常量,是不可修改的,,但是对于指针值本身是可以修改的。

然而对于“指针常量”来说,这个地址本身相当于一个常量了,也就是这个指针值是不可修改的,但它所指向的内容是可以修改的。

 

新建一个单文档应用程序,完成功能:

1.添加菜单项:“写入文件”和“读取文件”并增加响应;

void CFileView::OnFileWrite()

{

       FILE*pFile=fopen("1.txt","w");

       //现在希望在文件的开始再次写入,使用函数fseek控制文件指针的位置

   fseek(pFile,0,SEEK_SET);

       fwrite("ftp:",1,strlen("ftp"),pFile);

//     fwrite("http:www,sunxin.org",1,strlen("http:www,sunxin.org"),pFile);

       fwrite("http:www,sunxin.org",1,strlen("http:www,sunxin.org"),pFile);

       //表明文件写入操作已经完成了

       fclose(pFile);

       //有时候我们希望多次去操作文件,但是又不希望每次操作之后都去关闭文件

       //那么我们可以用另外一个函数去完成fflush:作用是刷新缓冲区,让缓冲区

       //中的数据写入到文件当中

   fflush(pFile);

}

 

{void CFileView::OnFileRead()

 

       //TODO: Add your command handler code here

       //以读取的方式打开

       FILE*pFile=fopen("1.txt","r");

       /*

       //定义一个字符数组,字符串是以"/0"结尾的,并初始化

       //charch[100]={0};//字符末尾出现乱码方法一:初始化

       charch[100];

       //memset用一个指定的字符来设置一个buffer

       //将字符数组中所有的数据都变成0了

       memset(ch,0,100);//字符末尾出现乱码方法二

  fread(ch,1,100,pFile);

       //将这个数据显示出来

       MessageBox(ch);

       */

 

              /*我们需要能够获取到文件的长度,然后我们根据文件的长度来分配内存的容量

      用了存放文件的数据

         要得到文件的长度,用函数ftell(得到文件指针当前的位置)

       */

   char *pBuf;

       //将文件指针移动到文件的结尾处

       //

       fseek(pFile,0,SEEK_END);

       //接下来就可以得到文件的长度了

   int len=ftell(pFile);

   //得到文件长度之后,我们可以根据文件长度去分配内存的大小

       //在这里多分配一个字节,是为了存放“/0”;

       pBuf=newchar(len+1); 

       //rewind重新放置文件的指针到文件的开始处,

       rewind(pFile);

       //然后就可以读取了

       fread(pBuf,1,len,pFile);

       //我们可以把数组的最后一个元素设置为0

       //对于数组来说,它的索引是从0开始的,那么对于len这样一个

       //数组元素来说它是数组当中最后一个元素

       pBuf[len]=0;

   MessageBox(pBuf);

       fclose(pFile);

       //程序运行读取的数据时乱码,原因:

       //当我们从文件指针移动到文件结尾之后,再次读取的时候,那么就是从文件

       //指针的下一个位置开始读取数据,而这个文件指针已经到文件结尾了,那么

       //我们想读取数据的时候也读不到了。

       //这里 rewind重新放置文件的指针到文件的开始处,添加代码:rewind(pFile);

}

 

2.下面我们看一个文件写入时经常回碰到的问题:

void CFileView::OnFileWrite()

{

       FILE*pFile=fopen("2.txt","w");

       charch[3];

       ch[0]='a';

       ch[1]=10;

       ch[2]='b';

       fwrite(ch,1,3,pFile);

       fclose(pFile);

}

 

void CFileView::OnFileRead()

{

       FILE*pFile=fopen("2.txt","r");

       charch[100];

       fread(ch,1,3,pFile);

       ch[3]=0;

       MessageBox(ch);

       fclose(pFile);

 //将文件打开的时候按照二进制的方式去打开

 

       //以文本方式去读和以二进制方式去读是有明显区别的:

   //以文本方式去读的时候,那么文件当中是四个字节的数据,我们只读三个字节

   //就可以将a,b读全了;但是,以二进制方式去读的时候,文件当中是四个字节

       //数据,我们读三个字节数据,只能读到前三个字节数据,最后一个字节b没读到 

}

 

 

二进制文件和文本文件:

a.      文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。

b.      文件通常分为二进制文件和文本文件。

c.      二进制文件是包含在ASCII及扩展ASCII字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。

d.      文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以“行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。

 

文本方式和二进制方式:

a.      当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车—换行(ASCII为13、10)。在读取文件时,一旦遇到回车—换行的组合(即连续的ASCII为13、10),则会转换为换行字符(ASCII为10)。

b.      当我们按照二进制方式往文件中写入数据,则将数据在内存中存储形式原样输出到文件中。 

总结:所以我们在读取文件和写入文件的时候,就要注意了,因为文本方式和二进制方式在读取和写入时候的差异,所以在读取和写入的时候要保持一致。如果我们采用文本方式去写入文件那么也应该利用文本的方式去读取文件。那么如果用二进制的方式去写入数据,那么读取的时候最好也按照二进制的方式去读取。

 

3.问题:

给你一个整数,例如:98341,将这个整数保存到文件中,要求在以记事本程序打开文件时,显示的是98431。

void CFileView::OnFileWrite()

{

       FILE*pFile=fopen("3.txt","w");

       inti=98341;

       charch[5];

       //定义一个整数

   /*

       ch[0]=9+48;

       ch[1]=8+48;

       ch[2]=3+48;

       ch[3]=4+48;

       ch[4]=1+48;*///方法一:

       //将整数转换为字符串存放起来,按十进制的方式转换

       itoa(i,ch,10);//方法二:

       //因为0的ASCII是48,那么9+48就可以的到9的ASCII

       //对于一个整数来说,它只占四个字节,所以项的大小设置为4个字节,

       //然后只需要写一个项就可以了

//     fwrite(&i,4,1,pFile);

       //字符数组有五个字节

       fwrite(ch,1,5,pFile);

       fclose(pFile);

   //运行之后是乱码:

       //一定要注意:对于一个文件来说,实际上就是数据在计算机内存当中的表现形式

   //在外部存储介质上的另一种存放形式。在第二行后添加代码.

}

 

4.在C++当中对文件的操作:

void CFileView::OnFileWrite()

{

       //往文件当中写入数据:

       //先构造一个对象,然后传递文件名

       ofstreamofs("4.txt");

       //往文件当中写入数据,strlen获取写入了多少数据

       ofs.write("http://www.sunxin.org",strlen("http://www.sunxin.org"));

       ofs.close();

       //最后还要包含一个头文件:#include<fstream.h> //系统文件用尖括号

}

 

void CFileView::OnFileRead()

{

       ifstreamifs("4.txt");

       //定义一个字符数组来存放数据

       charch[100];

       //将字符数组中所有的元素都设为0

       memset(ch,0,100);

   ifs.read(ch,100);

       ifs.close();

       //显示所读取的数据

       MessageBox(ch);

}

 

5.Win32 API中对文件操作的几个函数:

void CFileView::OnFileWrite()

{

       //定义一个句柄

       HANDLEhFile;

       hFile= CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,

              FILE_ATTRIBUTE_NORMAL,NULL);

       DWORDdwWrites;

       WriteFile(hFile,"http://www.sunxin.org",strlen("http://www.sunxin.org"),

              &dwWrites,NULL);

       CloseHandle(hFile);

}

 

void CFileView::OnFileRead()

{     HANDLEhFile;

       hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,

              FILE_ATTRIBUTE_NORMAL,NULL);

       charch[100];

       DWORDdwReads;

       ReadFile(hFile,ch,100,&dwReads,NULL);

       ch[dwReads]=0;

       CloseHandle(hFile);

       MessageBox(ch);

}

 

6.MFC当中对文件操作的类:

void CFileView::OnFileWrite()

{

CFile file("6.txt",CFile::modeCreate | CFile::modeWrite);

       file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));

       file.Close();

}

      

void CFileView::OnFileRead()

{

       CFilefile("6.txt",CFile::modeRead);

       char*pBuf;

       DWORDdwFilelen;

       dwFilelen=file.GetLength();

       pBuf=newchar[dwFilelen+1];

       pBuf[dwFilelen]=0;

       file.Read(pBuf,dwFilelen);

       file.Close();

       MessageBox(pBuf);

}

原创粉丝点击