第九章读书笔记

第九章学习笔记

  • 要求
    本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。
    文本文件中考虑字符读写,行读写,任意位置读写等
    文件操作都有什么?
    二进制文件和文本文件如何转换?
    数据结构如何读写?

  • 对IO库函数的调用是普通的调用。
    文件的系统调用和C语言中对文件的操作是相对应的,后者是建立在前者的基础之上的。在文件没有读完的情况下,剩余文件大小小于size(读取文件时的一次读多少),fread的返回值将会是0

  • IO库函数算法
    Fread()从系统内核中向内部缓冲区转移数据,然后在向程序的缓冲区转移。
    Fwrite()从程序缓冲区向内部缓冲区转移数据,接着从缓冲区向系统内核转移数据(两者都要等到缓冲区被填满后才进行下一项操作)
    Fclose()写操作调用时,先关闭文件流的局部缓冲区,在进行系统调用关闭FILE结构体的文件描述符FD,最后释放文件指针。
    系统调用的Read和write远比fread和fwrite更强大

  1. IO库模式

  2. 字符模式IO
    练习

  3. 行模式IO

  4. 格式化IO

  5. 内存中的转换函数(将ASCII数字转换成整数)

  6. 其他IO库函数(查一查相关函数使用说明)
    rewind(fp);//将文件中的位置指针重新定位到文件开头

  7. 限制使用FREAD和FWRITE。

同步两个指针,使写入位置保持正确。

  1. 文件流缓冲
    每一个文件流都是一个FILE结构体,其中包括一个内部缓冲区。

实例,在codeblocks中测试,打印过程没有区别

  1. 变参函数,codeblocks中没有自带的sdtarg宏变量

部分代码实现

点击查看代码
int main()
{
    FILE *fp;     //将小写字母转换成大写,记录行数
    int c;
    FILE *gp;
    int line=0;
    if((fp = fopen("justdance.txt","a+"))==NULL||(gp = fopen("ustdance.txt","a+"))==NULL)
    {
        printf("申请失败!");
        exit(0);
    }
    else
    {
        while((c=getc(fp))!=EOF)//fgetc()返回的是整数
        {
            if(c!=10)
            {
                putc(c-32,gp);
            }
            else
            {
                putc(c,gp);
                line++;//回车数量也就是行数
            }
        }
        fclose(fp);
        fclose(gp);
    }
    if((fp = fopen("justdance.txt","w"))==NULL||(gp = fopen("ustdance.txt","r"))==NULL)
    {
        printf("申请失败!");
        exit(0);
    }
    else
    {

        while((c=getc(gp))!=EOF)//fgetc()返回的是整数
        {
            putc(c,fp);
        }
        fclose(fp);
        fclose(gp);
        printf("大写更改成功!一共有%d行英文",line);
}
return 0
}
点击查看代码
int main()
{
    FILE *fp;     //将小写字母转换成大写,记录行数
    int c;
    int IsWords=0,i;//用来判断是否是单词
    int Wordsnum=0;
    char Words[20];
    if((fp = fopen("justdance.txt","r"))==NULL)
    {
        printf("申请失败!");
        exit(0);
    }
    else
    {

        while((c=getc(fp))!=EOF)//fgetc()返回的是整数
        {
            if((c>=97&&c<=122)||(c<=90&&c>=65))
            {
                Words[IsWords] = c;
                IsWords++;
            }
            else
            {
                if(IsWords>0)
                {
                    for( i=0;i<IsWords;i++)  //将单词打印出来
                    {
                        printf("%c",Words[i]);
                    }
                    printf("\n");
                    Wordsnum++;
                    IsWords=0;
                }
            }
        Wordsnum+=1;
        printf("一共有%d个单词\n",Wordsnum);
        fclose(fp);
    return 0;
}
}
  • 感悟
    应用程序想要顺利运行,离不开对文件的读取,与用户的交互也离不开输入输出,本章节主要讲述的是应用程序通过系统调用,将文件中的数据调用到程序所处的缓冲区之中为它所用。在程序员层次来看,就是通过一系列的函数,来实现文件内容的获取,以及控制获取的方式,流向等。
posted @ 2022-09-07 11:14  岳华  阅读(13)  评论(0编辑  收藏  举报