21 August 2014

流和FILE对象


  • 所有I/O函数都是围绕文件描述符的。
  • 对于标准I/O库,它们的操作是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。
  • __流的定向__决定了所读、写的字符是单字节还是多字节。当一个流最初被创建时,它并没有定向。如果在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向的。如果在未定向的流上使用一个单字节I/O函数,则将该流的定向设为字节定向的,相关函数:freopen()、fwide()
  • 为了引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。
  • 预定义文件指针:stdin、stdout、stderr

缓冲


标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。 3种类型的缓冲:

  1. 全缓冲:在填满I/O缓冲区后才进行实际I/O操作。
  2. 行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。
  3. 不带缓冲

相关函数:setbuf()、setvbuf()

流的操作


  1. 打开/关闭流 fopen()、freopen()、fdopen()、fclose()
  2. 读和写流
    • 每次一个字符的I/O:getc()、fgetc()、getchar()、ferror()、feof()、clearerr()、ungetc()、putc()、fputc()、putchar()
    • 每次一行的I/O:fgets()、gets()、fputs()、puts()
    • 直接I/O:fread()、fwrite(),能够实现一次读或写一个数据结构。fread和fwrite返回读或写的对象。数对于读,如果出错或到达文件尾端,则此数字可以少于要求的数字。在这种情况,应调用ferror或feof以判断究竟是哪一种情况。对于写,如果返回值少于所要求的数字,则出错。
  3. 定位流
    • V7:ftell()、fseek()、rewind()
    • Single UNIX Specification:ftello()、fseeko()
    • ISO C:fgetpos()、fsetpos()

格式化I/O


  • 格式化输出:printf()、fprintf()、dprintf()、sprintf()、snprintf()以及它们的变体(各函数名前加v);
  • 格式化输入:scanf()、fscanf()、sscanf()

获取文件描述符


每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符。

临时文件


ISO C:tmpnam()、tmpfile()

内存流


fmemopen()、open_memstream()、open_wmenstream()

时间和日期例程


由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)公元1970年1月1日 00:00:00这一特定时间以来经过的秒数。

time()、clock_gettime()、clock_getres()、clock_settime()、gettimeofday()、gmtime()、localtime()、mktime()、strftime()、strftime_l()