C语言fgetc和fputc函数用法详解(以字符形式读写文件)
在C语言中,"读写"文件比较灵活,既可以每次"读写一个字符",也可以"读写一个字符串",甚至是"任意字节"的数据(数据块)。
咱们接下来介绍以"字符形式" 读写 文件
以"字符"形式 读写文件时,每次可以从文件中"读取一个字符",或者向文件中"写入一个字符"。
主要使用两个函数 fgetc()函数(字符读取函数)和fputc()函数(字符写入函数)
一、字符读取函数 fgetc
fgetc是 file get char 的缩写,意思时从 "指定"的文件中 读取 一个字符。
fgetc()的用法:
int fgetc(FILE *fp);
fp为"文件指针" 强调N遍了!!!
fgetc()读取成功时 返回读取到的字符, 读取到"文件末尾"或者"读取失败"时 返回EOF
EOF 是 end of file 的缩写,表示"文件末尾",是在stdio.h中定义的"宏",它的值是一个"负数".往往是-1.
fgetc()的返回值类型之所以为 int ,就是为了 容纳 这个负数(char不能是负数)
EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
fgetc()得用法:
char ch;
FILE *fp = fopen("D:\\demo.txt","r+");
ch = fgetc(fp);
表示从D:\\demo.txt文件中读取一个字符,并保存到变量ch中。
在文件内部有一个"位置指针",用来指向当前读写到的位置,也就是读写到第几字节。
在文件打开时,该指针(位置指针)总是指向文件的第一字节。
使用fgetc()函数后,该指针(位置指针)会向后移动一个字节,所以可以连续多次使用fgetc()读取多个字符。
注意: 这个文件内部的"位置指针"与"C语言中的指针"不是一回事。
"位置指针": 仅仅是一个标志,表示"文件的读写位置",也就是读写到第几节,它不表示地址。
文件每读写一次,"位置指针"就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的。
接下来写个程序吧
//eg在屏幕上显示D:\\demo.txt文件的内容
#include<stdio.h>
int main()
{
FILE *fp;
char ch;
//如果文件不存在,给出提示并退出
if((fp=fopen("D:\\demo.txt","rt")) == NULL)
{
puts("Fail to open file!");
exit(0);
}
//每读取一个字节,直到读取完毕
while((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
putchar('\n');//输出换行符
fclose(fp);
return 0;
}
在D盘下创建 demo.txt 文件,输入任意内容并保存,运行程序,就会看到刚才输入的内容全部都显示在屏幕上。
该程序的功能是从文件中逐个读取字符,在屏幕上显示,直到读取完毕。
该程序的第15行是关键"while循环"的条件为(ch=fgetc(fp)) != EOF 。
fgetc()每次从"位置指针"所在的位置"读取一个字符",并保存到"变量ch",位置指针"向后移动一个字节"。
当"文件指针"移动到"文件末尾"时,fgetc()就无法读取字符了,于是返回EOF,表示文件读取结束了。
//对EOF的说明
EOF本来表示"文件末尾",意味着"读取结束",但是很多函数在"读取出错"时也返回EOF,那么当返回EOF时到底是读取完毕了还是读取出错了?
这时,我们可以借用 stdio.h 中的两个函数来判断,分别是"feof()"和"ferror()"。
1. feof()函数用来 判断 "文件内部指针"是否指向"文件末尾"
它的原型是:
int feof(FILF *fp);
当指向"文件末尾"时 返回"非零值",否则 返回"零值"。
2. ferror()函数用来 判断 "文件操作"是否"出错"。
它的原型是:
int ferror(FILE *fp);
出错时返回"非零值",否则返回"零值。"
二、字符写入函数fputc
fputc是 file output char 的缩写,意思是"向指定的文件" 写入 "一个字符"。
fputc()的用法为:
int fputc(int ch,FILE *fp);
"ch"为要写入的字符
"fp"为文件指针
fputc()写入成功时返回写入的字符,失败时返回EOF,返回值类型为int,也是为了容纳这个负数。
例如:
foutc('a',fp);
或者:
char ch = 'a';
fputc(ch,fp);
表示把字符'a'写入fp所指向的文件中。
//两点说明:
1. 被写入的文件可以用"写、读写、追加"方式打开
用"写或读写"方式打开一个"已存在的文件"时将清除原有文件内容,并将写入的字符放在"文件开头"。
如果需要"保留原有文件内容",并把写入的字符放在"文件末尾",就必须以"追加"方式打开文件。
不管以何种方式打开,"被写入的文件"若不存在时 则 创建该文件。
2. 每写入一个字符,文件内部"位置指针"向后移动一个字节。
举个程序例子加深印象吧
//eg从键盘输入一行字符,写入文件
#include<stdio.h>
int main()
{
FILE *fp;
char ch;
//判断文件是否成功打开
if((fp = fopen("D:\\demo.txt","wt+")) == NULL)
{
puts("Fail to open file!");
exit(0);
}
printf("Input a string:\n");
//每次从键盘读取一个字符并写入文件
while((ch = getchar()) != '\n')
{
fputc(ch,fp);
}
fclose(fp);
return 0;
}
运行程序,输入一行字符并按回车键结束,打开D盘下的 demo.txt 文件,就可以看到刚才输入的内容。
程序每次从键盘读取"一个字符"并写入"文件",直到按下回车键,"while条件"不成立,结束读取。