• 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

  • 相关阅读:
    windows下cocos2d-x环境搭建
    QT使用QPainter加水印
    在Visual Studio中使用.lib和.dll的环境搭建
    Android7.0 Phone应用源码分析(四) phone挂断流程分析
    Android7.0 Phone应用源码分析(三) phone拒接流程分析
    Android7.0 拨号盘应用源码分析(一) 界面浅析
    Android7.0 Phone应用源码分析(二) phone来电流程分析
    Android7.0 Phone应用源码分析(一) phone拨号流程分析
    cnblog之初来乍到
    深入浅出Android动态加载jar包技术
  • 原文地址:https://www.cnblogs.com/shady545/p/16684627.html