1、文件的打开
FILE *fopen( const char *filename, const char *mode );
filename:指向文件名字符串的常量指针,表明将要打开的文件
mode:文件打开模式,包括:
r --为读取而打开,如果文件不存在或不能找到,函数调用失败;
w --为写入而打开一个空文件,如果文件已存在,内容将被清空;
a --为写入而打开,如果文件已存在,则在文件尾部添加新数据,在写入新的数据之前不会移除文件中已有的EOF标记;如果文件不存在,自动创建该文件;
r++ --打开文件用于写入和读取,文件必须已存在;
w++ --打开一个空文件用于写入和读取,如果该文件已存在,内容将被清空;
a++ --打开文件用于读取和添加数据,在添加新数据之前会移除该文件中已有的EOF标记,添加写入操作完成后再恢复EOF标记;如果文件不存在,自动创建该文件;
rb --以二进制方式打开,进行读取操作
wb --以二进制方式打开一个空文件,执行写入操作
2、文件的写入
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
buffer:指向将要被写入文件的数据;
size:以字节为单位的项的大小,size_t类型(即为unsigned integer类型);
注意:一个字符为1个字节(size=1),一个int型整数为4个字节(size=4)
count:将要被写入的项的最大数目;
stream:指向FILE类型的指针,即fopen函数返回的指针;
/***file write***/
FILE *pFile = fopen("1.txt", "w");
fwrite("hello world!", 1, strlen("hello world!"), pFile);
fwrite("你好,Autumn!", 1, strlen("你好,Autumn!"), pFile);
fseek(pFile, 0, SEEK_SET);
fwrite("watch", 1, strlen("watch"), pFile);
fclose(pFile);
//fflush(pFile);
3、文件的读取
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer:指向存放数据的缓冲区的指针;
size:以字节为单位的项的大小;
count:将要读取的项的最大数目;
stream:指向FILE类型的指针,即fopen函数返回的指针;
/***file read***/
//方法一:
FILE *pFile = fopen("1.txt", "r");
char ch[100];
memset(ch, 0, 100); //将字符数组中的所有数据先都设置为0
fread(ch, 1, 100, pFile);
fclose(pFile);
MessageBox(ch);
/*
//方法二:
FILE *pFile=fopen("1.txt","r");
char *pBuf;
fseek(pFile,0,SEEK_END); //将文件指针移到文件的末尾
int len=ftell(pFile); //ftell返回文件指针当前的位置,即文件的长度
pBuf=new char[len+1]; //根据文件长度+“\0”分配内存
pBuf[len]=0; //索引从0开始,len的元素即为最后一个元素,对应“\0”
rewind(pFile); //将文件指针重新放到文件的开头
fread(pBuf,1,len,pFile);
fclose(pFile);
MessageBox(pBuf);
*/
4、文件的关闭
int fclose( FILE *stream );
stream:指向FILE类型的指针,即fopen函数返回的指针;
5、fflush函数
int fflush( FILE *stream );
stream:指向FILE类型的指针,即fopen函数返回的指针;
注:如果程序需要不断多次的操作某一文件,就不能在每次操作之后先关闭文件再从缓冲文件系统中将数据写入磁盘文件,此时就不能使用fclose函数,而应使用fflush函数来刷新缓冲区中的数据并将其写入磁盘文件中;
6、文件指针
int fseek( FILE *stream, long offset, int origin );
stream:指向FILE类型的指针,即fopen函数返回的指针;
offset:设定偏移量;
origin:指定文件指针的起始位置,包括:
SEEK_CUR --从文件指针当前位置处开始
SEEK_END --从文件的末尾处开始
SEEK_SET --从文件的开头处开始
void rewind( FILE *stream ); //将文件指针重新放置到文件的开头处
stream:指向FILE类型的指针,即fopen函数返回的指针;
long ftell( FILE *stream ); //返回文件指针当前的位置
stream:指向FILE类型的指针,即fopen函数返回的指针;
7、文本文件、二进制文件---文本方式、二进制方式
7.1文件是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式,文本文件只是一种特殊形式的文件,它所存放的每一个字节都可以转换为一个可读的字符;但文件本身在存放数据时,实际是按照数据在内存中存放的方式来存放的,不会存放“a”、“b”这样的字符,存放的都是它们的ASCII码;
7.2若按照二进制方式向文件中写入数据时,会将数据在内存中的存储形式原样输出到文件中;
7.3写入和读取文件时要保持一致,如果采用文本方式写入,应采用文本方式读取;采用二进制方式写入,应采用二进制方式读取;
7.4不管文本文件还是二进制文件,如果统一采用二进制方式进行写入和读取,则是不会出错的,因为这种读取和写入是严格按照一个字节一个字节进行的;
7.5不管是文本文件还是二进制文件,都可以采用二进制方式或文本方式打开,然后进行写入或读取;但是对于二进制文件,如果以文本方式读取,则会出现问题;
思考题:
1、给出一个整数:98341,将该整数保存到文件中,要求在以记事本程序打开该文件时,显示的是:98341;
思路:若将98341作为一个整数写入到文本文件中,然后再打开文件是不能看到这个整数的,而是乱码;应将98341转换为5个字符依次写入文本文件中,这样打开文件时才能看到要显示的数据;
//方法一:
FILE *pFile=fopen("2.txt","w");
char ch[5];
ch[0]=9+48; //数字字符0对应的ASCII码为48,9对应的ASCII码则为9+48
ch[1]=8+48;
ch[2]=3+48;
ch[3]=4+48;
ch[4]=1+48;
fwrite(ch,1,5,pFile);
fclose(pFile)
//方法二:
FILE *pFile = fopen("2.txt", "w");
int i = 98341;
char ch[5];
itoa(i, ch, 10);
fwrite(ch, 1, 5, pFile);
fclose(pFile);
2、给定一个字符串,既有数字字符又有英文字符,判断哪些是数字字符;
思路:字符的ASCII码值在48~57之间的,即为数字字符;