一.文件的类型:
文本文件(也称ASCII文件):文本文件的每一个字节存放一个ASCII码, 代表一个字符。
二进制文件:数据按其在内存中的存储形式存放在磁盘上。
例如:
设有一整数65 它在内存中的存储形式:
字符 65在文本文件中的存储形式: 0011 0110 0011 0101
字符’6’ 的ASCII码值为54, 25+24+22+21 =54;0011 0110;
字符’5’ 的ASCII码值为53, 25+24+22+20 =53;0011 0101;
65在二进制文件中的存储形式:0000 0000 0100 00001
65=26+20=64+1;
二.文件类型指针:
要使用一个文件需要有一定的信息 , 如文件当前的读写位置, 与文件对应的内存缓冲区地址, 文件的操作方式等。 这些信息都存放在“文件信息区”中 , “文件信息区”是一个结构体变量 , 其结构体类型由系统定义, 类型名为 FILE。
typedef struct
{ int level; /*缓冲区‘满’或‘空’的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读字符*/
int bsize; /*缓冲区的大小*/
unsigned char _FAR *buffer; /*数据缓冲区的位置*/
unsigned char _FAR *curp; /*指针,当前的指向*/
unsigned istemp; /*临时文件,指示器*/
short token; /*用于有效性检查*/
}FILE;
定义文件类型指针变量:
格式: FILE * 指针变量名 ;
注意: 1. 只有通过文件指针变量才能调用相应的文件。
2. 有n个文件就要定义n个文件指针变量,分别对应各个文件。
3. FILE必须大写。
使用文件的步骤:
1. 定义文件指针变量。
2. 打开文件, 并判断是否能正确打开文件,如果打开文件失败, 则退出程序。
3. 向文件写入数据, 或从文件读取数据 ,这是最重要的文件操作步骤。
4. 关闭文件。
例1 将字符’A’—’Z’写入文件保存起来
#include <stdio.h>
#include <stdlib.h>
int main( )
{
char ch;
FILE *fp; // 定义一个文件指针变量
fp=fopen("letter.dat", "w"); // 打开文件操作
if (fp==NULL) // 判断文件打开是否成功
{
printf("Opening file error! \n");
exit(0);
}
for (ch='A'; ch<='Z'; ch++)
fputc(ch, fp); // 将字符ch写入到文件中
fclose(fp); // 关闭文件
return 0;
}
三.文件的打开与关闭:
fopen函数
函数原型:FILE *fopen(char *filename, char *mode);
函数的返回值是一个地址, 即被打开文件所对应的“文件信息区”的起始地址, 使用时应将返回值赋给一个文件指针变量。
例:
FILE *fp ;
fp = fopen ( “file1.txt” , “r” ) ;
fp--让文件指针变量 指向被打开的文件;
file1.txt--需要打开的文件名;
r--使用文件的方式(只读);
文件的打开:
打开文件的方法:
打开文件时 , 因使用方式不对或其他原因, 可能会使打开文件操作失败 , 这时fopen函数的返回值是NULL, 所以在打开文件时通常会判断一下打开操作是否成功。
if ( ( fp = fopen(“file1.txt”, “r”) ) = = NULL )
{
printf(“Can not open this file!\n”);
exit( 0 );
}
注意:“!=”优先级高于“=” 所以为确保先算fp = fopen(“file1.txt”, “r”) 应当加上括号使之变为
( fp = fopen(“file1.txt”, “r”) )以减少出错(以防万一,都加上括号无论等不等)
file1.txt 存放在当前程序所在的目录下。
如果文件不在当前目录下,应写出文件的路径:
if ( ( fp = fopen(“e:\\data\\file2.txt”, “r”) ) = = NULL )
{
printf(“Can not open this file!\n”);
exit( 0 );
}
注:文件在e:\data目录下(data文件夹已存在)
在双引号中用2个斜杠表示1个斜杠(第一个斜杠表示转义)
文件的使用方式:
(1) “r”与“rb”: 只读“r”打开一个文本文件, “rb”打开一个二进制文件以此方式打开文件,该文件必须已经存在, 如不存在将出错打开文件后只能从文件中读数据, 当前读写位置位于文件开头
2) “w”与“wb”: 只写“w”打开一个文本文件, “wb”打开一个二进制文件新建一个文件。 打开文件后只能向文件中写数据, 当前读写位置位于文件开头
3) “a”与“ab”: 追加以此方式打开文件时, 如文件已存在, 则将当前读写位置位于文件末尾,可以追加数据; 如文件不存在, 则建立一个新文件
(4) “r+”与“rb+”: “+”表示即能读又能写, 用“r+”或“rb+”方式打开文件时, 文件必须已经存在,否则将出错
(5) “w+”与“wb+”: 以读/写方式打开文件, 建立一个新文件(如文件已存在, 则将原文件覆盖)
(6) “a+”与“ab+”: 以读/写方式打开文件, 如文件已存在, 可在文件末尾追加数据; 如文件不存在, 则建立一个新文件
说明: 以“a+”或“ab+” 打开已经存在的文件,若打开文件后直接写数据, 则新数据添加在文件的末尾;若打开文件后直接进行读数据, 则是从文件开头读取数据
文件的关闭:
fclose函数:
函数原型:(使用格式: fclose (文件指针变量);
int *fclose(FILE *fp);
函数的返回值是一个整数, 关闭成功返回0,出错返回非0值。
fclose函数的作用:
将文件指针变量所指向的文件关闭,即使文件指针变量不再指向该文件,以后不能通过文件指针变量对该文件进行操作
注: 不论用什么方式打开文件,关闭文件的方法都一样。
四.文件的字符读写函数:
单字符的写入函数:
函数原型:int fputc(int ch, FILE *fp);
ch:字符常量或变量; *fp:文件指针变量;
函数功能:将字符ch写入fp所指向的文件中。
函数返回值:成功时返回该字符, 失败时返回 EOF(-1)。
说明: 写入一个字符后, 文件位置指针将自动指向下一个字节。
例2 从键盘输入一行字符, 写到文本文件string.txt中
#include <stdio.h>
#include <stdlib.h>
int main( )
{
FILE *fp;
char ch;
if( (fp=fopen("string.txt", "w") )==NULL)
{
printf("can't open file\n");
exit(0);
}
do
{
ch=getchar( ); //从键盘输入一个字符
fputc(ch, fp); //将ch中的字符写到文件中
}while(ch!='\n');
fclose(fp);
return 0;
}
例3 将一个文本文件的内容复制到另一个文件中
int main( )
{
FILE *fp_in, *fp_out;
char ch, infile[20], outfile[20];
scanf("%s", infile);
scanf("%s", outfile);
if((fp_in=fopen( infile, "r"))==NULL)
{
printf("can't open file:%s", infile);
exit(0);
}
if((fp_out=fopen( outfile, "w"))==NULL)
{
printf("can't open file:%s", outfile);
exit(0);
}
while( !feof(fp_in) ) //feof函数检查文件是否结束,结束返回非零值,否则返回零
{
ch= fgetc(fp_in); //该处还可直接写为fputc( fgetc(fp_in), fp_out);
fputc(ch, fp_out); /*循环也可以写为while( (ch=fgetc(fp_in))!=EOF )
fputc(ch, fp_out);*/
}
fclose(fp_in);
fclose(fp_out);
return 0;
}
声明:本文章内容主要来自于课堂课件,在下只是进行总结(仅占小部分,嘿嘿),相当于一次课堂笔记(这样有助于提高自己的能力),希望各位大佬们多多包涵不吝赐教,谢谢大家能看完我拙略的排版以及有些乱的注释,我今后会好好努力改正的,加油!冲冲冲!干就完了!
特别感谢我的好兄弟们对我的关注和点赞,nice!