对于一个嵌入式开发人员来说,对文件的操作是非常频繁的,所以,对文件操作的知识需要相当的熟悉。
文件部分由几个常用的函数,总结如下:
打开关闭文件函数:fopen()和fclose();
字符读写函数: fgetc()和fputc();
字符串读写函数: fgets()和fputs();
数据段读写函数: fread()和fwrite();
格式化读写函数: fprintf()和fscanf();
首先,标准文件的操作对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。
下面举一些简单的例子对fgetc()和fputc()函数的使用:
fgetc函数的功能是从指定的文件中读一个字符。
函数调用的形式为:字符变量=fgetc(文件指针);
例如:ch=fgetc(fp);
其意义是从打开的文件fp中读取一个字符并送入ch中。
a.c
#include<stdio.h>
main()
{
FILE *fp; çFILE是由系统定义取名,用来存放文件有关信息的一个结构类型(须大写)
char ch:
if((fp=fopen(“/root/test/a.txt”,”rt”))==NULL) ç如a.txt不存在fp会指向空,成为空指针
{
printf(“Can not open file!”);
exit(0);
} ç这段程序来判断是否有所指定的文件,如要打开的文件不存在,会提示指定信息
ch=fgetc(fp); ç 把从文件读出的字符赋值给字符变量ch
while(ch!=EOF) çEOF为文件的末尾,到达文件末尾之前一直循环
{
putchar(ch); ç 输出单个字符ch
ch=fgetc(fp); ç 再次给ch赋值,直到读入内容结束
} ç 此循环的作用为将读入的字符逐个输出,达到输出字符串的目的
printf(“/n”); ç输出工作完成后,再输出一个换行
fclose(fp); ç 对文件操作完成后要关闭文件
}
fputc()函数的功能是把一个字符写入指定的文件中,
函数的调用形式为:fputc(字符量,文件指针);
其中,待写入的字符量可以是字符常量或变量。
例如:fputc(‘a’,fp);其意义是把字符a写入fp所指向的文件中。
b.c
#include<stdio.h>
main()
{
FILE *fp;
char ch;
If((fp=open(“/root/a.txt”,”wt+”))==NULL)
{
printf(“Can not open file!”);
exit(0);
}
printf(“please input a char:/n”);
ch=getchar();
while(ch!=’/n’)
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp); ç 位置指针复位函数,使位置指针移到文件的首部,以便从文件首开始读
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf(“/n”);
fclose(fp);
}
从程序的调试过程中可以体会到以下感受到:
为增强程序的可靠性,常用下面的方法打开一个文件:
if((fp=fopen("文件名","操作方式"))==NULL)
{
printf("can not open this file/n");
exit(0);
}
使用文件的方式有以下几种,下面给出了它们的符号和意义:
“r” 只读打开一个文本文件,只允许读数据
“w” 只写打开或建立一个文本文件,只允许写数据
“a” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
“rt+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
“rt” 只读打开一个文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件的末尾写数据
文件的使用方式由r,w,a,t,b,+等六个字符拼成,各字符的含义如下:
r---read: 读 w---write:写 a---append:追加 t---text:文本文件 b---banary:二进制文件
+ --- 读和写
凡是用”r”打开一个文件,该文件必须已经存在,且只能从该文件中读出。
凡是用”w”打开的文件只能向该文件写入。若该文件不存在则自动创建,若存在则将其删除并建立一个新文件。
凡是用”a”打开一个文件,只能向已经存在的文件追加信息。
对于fgetc函数的使用:
1.在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
2.读取字符的结果也可以不向字符变量赋值,例如:fgetc(fp);但是读出的字符不能保存。
3. 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
对于fputc函数的使用:
1.被写入的文件可以用、写、读写,追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。
2.每写入一个字符,文件内部位置指针向后移动一个字节。
3.fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功。
关于exit()函数
格式:void exit(程序状态值);
功能:关闭已经打开的所有文件,结束程序运行,返回操作系统,并将”程序状态值”返回给操作系统。当”程序状态值”为0时,表示程序正常退出;非0值时,表示程序出错退出。
r+ 和a+的区别:使用前者打开文件时,读写位置指针指向文件头,即写入文件时覆盖原来的内容;使用后者,读写指针指向文件尾,即写入内容时追加到原内容后面。
使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。