一.常用函数介绍
功能:打开文件:
声明:
FILE* fopen(const char* filename, const char* mode);
参数:filename 文件名
mode 文件的类型和操作要求
返回值:返回文件指针,如果出现错误会返回NULL。
注:
1.mode有12种,由r(读),w(写),a(追加),t(文本读写,可省略不谢),b(二进制文件),+(读和写组成),12中组合分别是:
rt(r) 只读打开一个文本文件,wt(w)只写打开或建立一个文本文件,at(a)追加打开或建立一个文本文件。对应的二进制文件版本为rb、wb、ab。
rt+(r+) 读写打开一个文本文件,wt(w)读写打开或建立一个文本文件,at(a)读写打开或建立一个文本文件。对应的二进制文件版本为rb+、wb+、ab+。
2.r模式打开文件,该文件必须已经存在,否则会引起异常。
w模式打开文件,如果文件不存在,会建立该文件,如果文件已经存在,则会删除该文件重新创建一个新的文件。
a模式打开文件,如果文件不存在,会建立该文件,如果文件已经存在,则不会重新创建文件。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:从指定文件读一个字符,读取一个字符后,文件位置指针向后移动一个字节
声明:
int fgetc(FILE* stream);
参数:stream 文件指针
返回:返回读取到的字符,如果返回EOF表明已经读到了文件末尾或者出现错误。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:往指定文件写一个字符,写入一个字符后,文件位置指针向后移动一个字节。
声明:
int fputc(int c, FILE* stream);
参数:c要写入的字符
stream 文
返回:正常情况下返回读取字符的ascii码值,出错时返回EOF。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:从指定文件中读一个字符串到字符数组中
声明:
char* fgets(char* str, int n, FILE* stream);
参数:str 读出的字符串
n 最大读取长度
stream 文件指针
返回:成功返回第一个参数str,失败返回NULL
注:本函数会读出n-1个字符到str中,并在最后一个字符后加上结束标志'\0',在读出n-1个字符之前,如果遇到了换行符或EOF,则读出结束。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:像指定文件写入一个字符串
声明:
int fputs(const char* str, FILE* stream);
参数:str 要写入的字符串
stream 文件指针
返回:成功返回非负整数,失败返回EOF
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:从文件中读取整块数据
声明:
size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
参数:buffer 接收数据的内存地址
size 数据块的字节数
count 读数据块的块数
stream 文件指针
返回:实际读取数据块数,如果返回值和count不相同,可能文件结尾或出现错误。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:写整块数据到文件中
声明:
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
参数:buffer 写入数据的内存地址
size 数据块的字节数
count 写数据块的块数
stream 文件指针
返回:实际写入数据块数,如果返回值和count不相同,可能文件结尾或出现错误。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:格式化读文件
声明:
int fscanf(FILE* stream, const char* format[,argument...]);
参数:stream 文件指针
format 格式字符串
argument 输入列表
返回:成功读出参数的个数。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:格式化写文件
声明:
int fprintf(FILE* stream, const char* format[,argument...]);
参数:stream 文件指针
format 格式字符串
argument 输出列表
返回:成功写入参数的个数。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:将文件内部指针移动到文件首。
声明:
void rewind(FILE* stream);
参数:stream 文件指针
返回值:无
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:重定位文件内部指针位置
声明:
int fseek(FILE* stream, long offset, int origin);
参数:stream 文件指针
offset 偏移量
origin 起始点(从何处开始计算偏移量)
注:1.偏移量可正可负,正表示向后移,负表示向前移
2. origin的取值有 文件首:SEEK_SET 当前位置:SEEK_CUR 文件末尾:SEEK_END
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:判断文件是否处于结束位置
声明:
int feof(FILE* stream);
参数:stream 文件指针
返回值:如果文件结束返回非0值,否则返回0
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
功能:检查文件再用各种输入输出函数进行读写时是否出错
int ferror(FILE* stream);
参数:stream 文件指针
返回值:如果没有出错返回0,否则返回非0
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------功能:清除出错标志和文件结束标志
声明:
void clearerror(FILE* stream);
参数:stream 文件指针
返回值:无
二.一些例子
例1 fputc fgetc的应用
void main()
{
FILE *fp; //定义一个文件指针
char ch;
fp = fopen("c:\\test.txt","w+"); //读写方式打开文件
if(fp==NULL) //判断打开是否成功
printf("fopen error");
ch=getchar(); //从键盘接收输入字符
while(ch!='\n') //如果遇到回车结束
{
fputc(ch,fp); //将字符写到文件里
ch=getchar(); //从键盘接收输入字符
}
rewind(fp); //将文件内部指针移动到文件首
ch = fgetc(fp); //从文件中读一个字符
while(ch!=EOF) //读到文件末尾结束
{
putchar(ch); //显示读出的字符
ch = fgetc(fp); //从文件中读一个字符
}
fclose(fp); //关闭文件
}
本例会在c盘创建一个文件,把从键盘输入的内容(以回车结束输入)写入到文件中,再把文件中的内容读出并显示出来。由于打开方式是w+,每次执行都会重新创建文件替换原来的。
例2 fpucs fgets的应用
void main()
{
FILE *fp; //定义一个文件指针
char *wStr = "123456789"; //要写入的字符串
char rStr[20] = {0}; //用于存放读出字符串
fp = fopen("c:\\test.txt","w+"); //读写方式打开字符串
if(fp==NULL) //判断打开是否成功
printf("fopen error");
fputs(wStr,fp); //将字符串写入到文件内
rewind(fp); //将文件内部指针移动到文件首
fgets(rStr,strlen(wStr),fp); //读出文件中的字符串
printf("%s",rStr); //输出“12345678”
fclose(fp); //关闭文件
}
strlen的值为9,fgets读出n-1也就是8字节的内容到rStr中,并在读出内容末尾添加'\0',所以本例会打印出“12345678”。
例3 fread fwrite的应用以及fopen打开方式的应用
void main()
{
FILE *fp; //定义一个文件指针
char writeBuff[] = "12345678"; //要写入文件的数据
char readBuff[9] = {0}; //存放读数据的缓冲
int len = strlen(writeBuff); //计算写入长度
fp = fopen("c:\\test.txt","w"); //只写方式打开文件
if(fp==NULL) //判断打开是否成功
printf("fopen error");
fwrite(writeBuff,len,1,fp); //将数据写入文件
rewind(fp); //将文件指针定位到文件开头
fread(readBuff,len,1,fp); //尝试读文件
printf("%s",readBuff); //没有输出任何内容
fclose(fp); //关闭文件
}
由于只写方式打开文件,所以无法读出内容,改成读写方式打开后即可输出“12345678”。
例4, fread(fwrite)第二、第三个参数和返回值
void main()
{
FILE *fp; //定义一个文件指针
size_t count = 0;
char readBuff[9] = {0}; //存放读数据的缓冲
fp = fopen("c:\\test.txt","r"); //只读方式打开文件,文件中已经存在内容12345678
if(fp==NULL) //判断打开是否成功
printf("fopen error");
count=fread(readBuff,8,1,fp); //读文件,读一次,每次读8个字节
printf("count = %d readBuff = %s\n",count,readBuff);
rewind(fp); //将文件指针定位到文件开头
count=fread(readBuff,4,2,fp); //读文件,读两次,每次读资格文件
printf("count = %d readBuff = %s\n",count,readBuff);
fclose(fp); //关闭文件
}
执行结果:
例5 文本打开和二进制打开
void main()
{
FILE *fp; //定义一个文件指针
char ch;
fp = fopen("c:\\test.txt","w+"); //文本读写方式打开文件
if(fp==NULL) //判断打开是否成功
printf("fopen error");
fputc('\n',fp); //输入换行符
rewind(fp); //将文件指针定位到文件开头
ch=fgetc(fp);
while(ch!=EOF)
{
printf("%02x ",ch); //二进制打印
ch=fgetc(fp);
}
printf("\n");
fclose(fp); //关闭文件
}
程序执行后,文件中的内容:
程序显示的内容:
在windows系统中文本模式下,系统以“\r\n”表示换行,以文本写入,函数会自动在‘\n’前加上'\r',读的时候再去掉‘\r’
把上面例子稍作修改
void main()
{
FILE *fp; //定义一个文件指针
char ch;
fp = fopen("c:\\test.txt","w"); //文本只写方式打开文件
if(fp==NULL)
printf("fopen error");
fputc('\n',fp);
fclose(fp); //关闭文件
fp = fopen("c:\\test.txt","rb"); //在以二进制只读方式打开文件
if(fp==NULL)
printf("fopen error");
ch=fgetc(fp);
while(ch!=EOF)
{
printf("%02x ",ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp); //关闭文件
}
本例先用文本方式打开文件,写入换行符,再以二进制方式读文件,读出结果:
二进制模式下,读写不会自动添加和删除‘\r’