zoukankan      html  css  js  c++  java
  • UNIX环境高级编程--5

                  标准I/O库
    流和FILE对象:
        所有I/O函数都是围绕文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。当用标准I/O库打开或者创建一个文件时,我们已使得一个文件与流关联。
        流的定向:决定了所读、写的字符是单字节还是多字节(宽)字符集。
        freopen函数清楚一个流的定向;fwide函数可设置流的定向(返回+ : 宽定向   -:字节定向   0:未定向)。

    缓冲:
        标准I/O库提供缓存的目的是尽可能的减少使用能够read和write的次数。
        (1)全缓存。当缓冲区满时,可以调用flush冲洗函数来将缓存的文件写入磁盘上。
        (2)行缓冲。当在输入或输出中遇到了换行符,执行行缓冲。
        (3)不带缓冲。标准错误流stderr通常是不带缓冲的,使得错误信息可以尽快的显示出来。
        系统默认全缓冲,终端设备行缓冲。
        
    打开流:
        fopen函数打开路径名pathname的一个指定的文件。
        freopen函数在一个指定的流上打开一个指定的文件,如该流已经打开,则先关闭流。如若该流已经定向,则使用freopen清楚该定向。
        fdopen函数取一个已有的文件描述符,并使一个标准的I/O流与该描述符相结合。
        
    每次一行I/O:
        读入:
        fgets和gets两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets从指定的流读。
        char *fgets(char *restrict buf, int n, FILE *restrict fp):必须指定缓冲长度n。函数一直督导下一个换行符为止,但是不超过n-1个字符。、
            如超过字符限制将会下次继续读取该行。
        gets:函数不安全的原因在于没有制定缓冲区大小,可能导致缓冲区溢出。这种缺陷曾被利用,造成1988年的因特网蠕虫时间。
              gets不将换行符放入缓冲区。
        输出:
            puts和fputs。

    二进制I/O:
        进行二进制I/O操作,我们更愿意一次读写一个完整的结构。如果使用getc或putc读、写一个结构那么必须循环通过整个结构,每次循环处理一个字节。一次读或者写一个字节。如果使用fputs和fgets那么因为fputs在遇到null字节停止,而在结构中可能包含null字节或换行符,则fgets也不能正常工作。因此,提出了执行二进制I/O操作的两种函数:
        fread:
        fwrite:
        (1)读写一个二进制数组。例如,将一个浮点数组的第2-5个元素写到一文见上。
            float data[10];
            if (fwrite(&data[2], sizeof(float), 4, fp) != 4)
                err_sys("fwrite error");
        (2)读写一个结构。
            struct{
                short  count;
            }item;
            if(fwrite(&item, sizeof(item), 1, fp) != 1)
                err_sys("fwrite error");

    定位流:
        存储文件的位置以及文件的偏移量。
        
    格式化I/O:
        printf将格式化数据输出到标准输出;
        fprintf将格式化数据输出到指定的流;
        dprintf写至指定的文件描述符;
        sprintf将格式化的字符送入数组buf,可能会造成缓冲区溢出。
        snprintf缓冲区长度是一个显示参数。
        
    临时文件:
        tmpnam:函数产生一个与现有文件名不同的一个优先路径名字符串。每次调用它,都会产生一个不同的路径名,最多调用次数TMP_MAX。
        tmpfile:创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件。
        mkdtemp:创建一个目录
        mkstemp:创建一个文件 不会自动删除 如果希望从文件系统空间中删除,必须自己对它解除链接。

    内存流:
        标准I/O库把数据缓存在内存中。我们也可以通过调用setbuf和setvbuf函数让I/O库使用我们自己的缓冲区。
        
    注解:
        restrict:C语言中的一种类型限定符。告诉编译器,对象已经被指针引用,不能通过该指针外其他直接或间接方式修改该对象的内容。

  • 相关阅读:
    HashMap源码解析
    编程语言java-并发(锁)
    标日第八课—词汇
    mysql 全文搜索的FULLTEXT
    Objective-C基础1:OC中类的继承和组合
    Xcode常用快捷键
    win7 64位,vs2012配置Qt5教程
    数据结构视频
    剑指offer(一)
    [转]SQL语句优化技术分析
  • 原文地址:https://www.cnblogs.com/luntai/p/6134161.html
Copyright © 2011-2022 走看看