20201318李兴昕第九章学习笔记

第九章:I/O库函数

知识点归纳总结:

本章讨论了I/O库函数,解释了什么是I/O库函数以及系统调用的用法。详细解释了几个经典I/O库函数例如:fread,fwrite,fclose,而且还介绍了这几个函数与read,write,close之间的关系。介绍了I/O库函数的不同模式,包括字符模式,行模式,结构化记录模式和格式化I/O操作。解释了文件流缓冲方案,并通过示例说明了不同方案的效果。

  1. fopen():文件打开操作
    头文件:stdio.h
    函数定义:FILE *fopen(char *pname, char *mode)
    函数说明:pname是文件名,mode是打开文件的方式
  2. fclose():文件关闭
    函数定义:int fclose(FILE *fp);
    函数说明:fp是一个以打开的文件的文件指针
    返回值:
    正常返回:0
    异常返回:EOF,表示文件在关闭时发生错误
  3. fgetc():读取一个字符
    函数定义:int fgetc(FILE *fp)
    函数说明:从fp中读取一个字符,作为返回值返回
    返回值:
    正常返回:返回读取字符的代码
    异常返回:返回EOF。例如:要从“写打开”的文件中读取一个字符时,会发生错误而返回一个EOF
  4. fputc():写一个字符到文件中
    函数定义:int fputc(int ch, FILE*fp)
    函数说明:ch是一个整型变量,要写到文件的字符
    fp:文件指针,要写入的文件
    返回值:
    正常返回:要写入的字符的代码
    异常返回:返回EOF
  5. fgets():从文件中读取一个字符串
    函数定义:char *fgets(char *str, int n, FILE *fp)
    函数说明:由fp指出的文件中读取n-1个字符,并把他们存放到有str指出的字符数组中区,最后加上一个由字符串结束符'\0'
    参数说明:str:接受字符串的内存地址,可以是数组别名,也可以是指针
    n:指出要读取的字符的个数
    fp:这个是文件指针,指出要从中读取字符的文件
    返回值:
    正常返回:字符串的内存首地址,即str的值
    异常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。
  6. 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中存入我的学号姓名
image
运行tmp.c
image
tmp2中存入了我的姓名的大写
image

练习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中存入一篇英语作文
image
运行结果如下:
image

问题与解决思路

问题:二进制文件和文本文件如何转换?
解决思路:通过查找资料得到:
使用vim修改:vim -b文件名
:%!xxd ——转化成16进制
然后进行修改二进制
:%!xxd -r——转回去
:wq

posted @ 2022-09-11 19:09  李兴昕  阅读(19)  评论(0编辑  收藏  举报