第九章:I/O库函数
知识点归纳总结:
本章讨论了I/O库函数,解释了什么是I/O库函数以及系统调用的用法。详细解释了几个经典I/O库函数例如:fread,fwrite,fclose,而且还介绍了这几个函数与read,write,close之间的关系。介绍了I/O库函数的不同模式,包括字符模式,行模式,结构化记录模式和格式化I/O操作。解释了文件流缓冲方案,并通过示例说明了不同方案的效果。
- fopen():文件打开操作
头文件:stdio.h
函数定义:FILE *fopen(char *pname, char *mode)
函数说明:pname是文件名,mode是打开文件的方式 - fclose():文件关闭
函数定义:int fclose(FILE *fp);
函数说明:fp是一个以打开的文件的文件指针
返回值:
正常返回:0
异常返回:EOF,表示文件在关闭时发生错误 - fgetc():读取一个字符
函数定义:int fgetc(FILE *fp)
函数说明:从fp中读取一个字符,作为返回值返回
返回值:
正常返回:返回读取字符的代码
异常返回:返回EOF。例如:要从“写打开”的文件中读取一个字符时,会发生错误而返回一个EOF - fputc():写一个字符到文件中
函数定义:int fputc(int ch, FILE*fp)
函数说明:ch是一个整型变量,要写到文件的字符
fp:文件指针,要写入的文件
返回值:
正常返回:要写入的字符的代码
异常返回:返回EOF - fgets():从文件中读取一个字符串
函数定义:char *fgets(char *str, int n, FILE *fp)
函数说明:由fp指出的文件中读取n-1个字符,并把他们存放到有str指出的字符数组中区,最后加上一个由字符串结束符'\0'
参数说明:str:接受字符串的内存地址,可以是数组别名,也可以是指针
n:指出要读取的字符的个数
fp:这个是文件指针,指出要从中读取字符的文件
返回值:
正常返回:字符串的内存首地址,即str的值
异常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。 - fputs():写入字符串到文件中去
函数定义:把由str之处的字符串写入到fp所指的文件中去
函数说明:
str:之处要写入到文件中去的字符串,不包括最后的'\0'
fp:这个是文件指针,之处字符串要写入到的文件指针
返回值:
正常返回:写入到的文件的字符个数,即字符串的长度
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。
实践:
练习9.2:编写一个C程序,将文本文件中的大写字母转换为小写字母
//C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符。
#include <stdio.h>
#include <stdlib.h>
#define INPUT_FILE "tmp1.txt" //同一文件夹下的输入文件
#define OUTPUT_FILE "tmp2.txt" //同一文件夹下的输出文件
int main(void)
{
char c;
FILE *finput, *foutput; //定义文件类型的指针变量
finput = fopen(INPUT_FILE, "r"); //以只读的方式打开“tmp1”文件
foutput = fopen(OUTPUT_FILE, "w"); //以只写的方式打开输出文件,如果没有则新建输出文件
while ((c = fgetc(finput)) != EOF) //如果输入文件不为空
{
if (isupper(c) || islower(c)) //islower 该函数检查所传的字符是否是小写字母 isupper该函数检查是否为小大写字母
{
fputc(toupper(c), foutput); //将得到的结果转成大写字母并写入输出文件
}
}
return 0;
}
tmp1中存入我的学号姓名
运行tmp.c
tmp2中存入了我的姓名的大写
练习9.3:编写一个C程序,计算文本文件的行数。
#include <stdio.h>
#include <stdlib.h>
#define INPUT_FILE "tmp3.txt" //同一文件夹下的输入文件
int main()
{
int count = 0;
char c;
FILE *fp;
if((fp=fopen(INPUT_FILE,"r"))==NULL) //如果文件不存在
{
printf("Can not open this file.\n"); //打印错误信息
exit(0);
}
while (!feof(fp)) //如果输入文件不为空
{
c = getc(fp); //遍历文件字符
if(c =='\n') //如果检测到换行符
{
count++; //计算行数
}
}
printf("the row of the file is %d\n",count+1);
return 0;
}
tmp3中存入一篇英语作文
运行结果如下:
问题与解决思路
问题:二进制文件和文本文件如何转换?
解决思路:通过查找资料得到:
使用vim修改:vim -b文件名
:%!xxd ——转化成16进制
然后进行修改二进制
:%!xxd -r——转回去
:wq