zoukankan      html  css  js  c++  java
  • 20191330雷清逸 学习笔记2

    20191330 雷清逸 学习笔记2(第九章)

    一、知识点归纳以及自己最有收获的内容

    知识点归纳

    I/O库函数与系统调用

    该部分主要介绍了I/O库函数,并将其与系统调用作比较,写出open()和fopen()等函数的区别,例如在系统调用程序中,文件描述符fd是一个整数,而在库I/O程序中,fp是一个文件流指针。

    I/O库函数的算法

    1.fread算法:在第一次调用freadO时,FILE结构体的缓冲区是空的,freadO使用保存的文件描述符fd发出一个n = read(fd, fbuffer, BLKSIZE);系统调用,用数据块填充内部的fbuf[]。然后,它会初始化fbuf[]的指针、计数器和状态变量,以表明内部缓冲区中有一个数据块。接着,通过将数据复制到程序的缓冲区,尝试满足来自内部缓冲区的fread调用。如果内部缓冲区没有足够的数据,则会再发出一个 read()系统调用来填充内部缓冲区,将数据从内部缓冲区传输到程序缓冲区,直到满足所需的字节数(或者文件无更多数据)。将数据复制到程序的缓冲区之后,它会更新内部缓冲区的指针、计数器等,为下一个fread()请求做好准备。然后,它会返回实际读取的数据对象数量。

    2.fwrite算法:fwrite()算法与fread()算法相似,只是数据传输方向不同。最开始,FILE结构体的内部缓冲区是空的。在每次调用fwrite()时,它将数据写入内部缓冲区,并调整缓冲区的指针、计数器和状态变量,以跟踪缓冲区中的字节数。如果缓冲区已满,则发出 write()系统调用,将整个缓冲区写入操作系统内核。

    3.fclose算法:若文件以写的方式被打开,fclose()会先关闭文件流的局部缓冲区。然后,它会发出一个close(fd)系统调用来关闭FILE结构体中的文件描述符。最后,它会释放FILE结构体,并将 FILE 指针重置为 NULL。

    I/O库模式

    fopen()中的模式参数可以指定为:r、w、a,分别表示读、写、追加。

    "+"号表示同时读写

    文件缓冲流

    无缓冲:从非缓冲流中写入(读取)的字符将尽快单独传输到文件(从文件传输)

    行缓冲:遇到换行符,写入行缓冲流的字符以块的形式传输,如文件流stdout

    全缓冲:文件流的正常缓冲方案,以块大小传出

    二、问题与解决思路

    文本文件操作

    问:文件操作都有什么?

    答:基本操作有:复制、剪切、重命名和删除等基本功能。这些功能和其它功能在鼠标选中-右键后都能看到。高级操作有:压缩,移动等功能。

    二进制文件操作

    问:二进制文件和文本文件如何转换?

    答:首先,二进制文件和文本文件有以下几种不同:

    1.能存储的数据类型不同

    2.每条数据的长度不同

    3.读取的软件不同

    4.操作系统对换行符(‘ ’)的处理不同

    转换方式为:创建个文本格式的输入文件a1.txt,编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示,并存入输出文件a2.txt中。然后再将二进制文件还原并存入a3.txt文件。

    代码:

    #include <cstdio>
    #include <stdio.h>
    #include <string.h>
    #define NSIZE  8
    
    void print_2(int val2);
    /***********文本文件转二进制**********/
    void Text2Bin(const char* sIn,const char* sOut){
        char a[255];
        int count = 0;
        int ch;
        for(int j=0; j<255;j++)a[j]='';
        FILE* fin=fopen(sIn,"r");
        FILE* fout=fopen(sOut,"w");
        for(int i=0 ; i<=255 ; i++)fscanf(fin,"%c",&a[i]);
        for(int k=0 ; k<=254&&a[k] !=''; k++)
        {   
            ch = a[k];
            for(int a=7;a>=0;a--) fprintf(fout,"%d",ch>>a&1);
            //fprintf(fout,"
    ");
        }
        fclose(fin);
        fclose(fout);
    }
    /***********二进制文件转文本文件**********/
    void Bin2Text(const char* sIn,const char* sOut){
        FILE* fin=fopen(sIn,"r");
        FILE* fout=fopen(sOut,"w");
        char str[255*8];
        for(int r=0; r<255 ;r++) str[r]='';
        int i = 0, j = 0, iTemp = 0, flag = 0;
        int  ibina[NSIZE];          
        char cRead[NSIZE];              
        char cChar;
        for(int a=0 ; a<=255 ; a++)fscanf(fin,"%c",&str[a]);
        //for(int f=0 ; f<=255 ; f++)printf("%c",str[f]);
        while(flag <= 255){
            //printf("%d",flag);
            for(int b=flag ; b>=flag && b<flag+NSIZE ; b++)
            {
                //printf("%d",b%8);
                cRead[b%8] = str[b];
                //printf("%c",cRead[b%8]);
            }
            for(i = 0; i < NSIZE; i++)
            {
                ibina[i] = (cRead[i]-'0'); 
            }
            iTemp = 1;
            cChar = 0;
            for(j = 7; j >=0 ; j--)
            {
                //printf("%c",ibina[j]);
                //printf("%d
    ",cChar);
                cChar+=ibina[j]*iTemp;
                iTemp *= 2;
            }
            printf("%c",cChar);
            fprintf(fout,"%c",cChar);
            flag=flag+8;
        }
        fclose(fin);
        fclose(fout);
    }
    
    int main(){
        Text2Bin("d:\a1.txt","d:\a2.txt");
        Bin2Text("d:\a2.txt","d:\b2.txt");
        printf("
    Successfully converted file!
    "); 
        return 0;
    }
    

    参考链接:https://blog.csdn.net/zhangzhiyuan88/article/details/80496978

  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/leo-skr/p/15312704.html
Copyright © 2011-2022 走看看