标准I/O

2018-08-06 (星期一)
标准I/O
    标准I/O是与平台无关的用户缓冲方案.

文本指针
    标准I/O历程不会直接操作文件描述符,而会使用他们自己的标识符,成为"文件指针"(file pointer),在C链接库之内,文件指针会映射到一个文件描述符.文件指针会被表示成一个指向typedef所定义的FILE结构的指针(定义于<stdio.h>)
    在标准I/O用语,一个一打开的文件成为"流"(stream).流可能会被打开以供读取(输入流),写入(输出流)或读取(输入/输出流)

打开文件
    要打开文件以备通过fopen()读取或写入:

#include <stdio.h>
FILE * fopen (const char *path, const char *mode);

此函数会根据所指定的模式打开文件path,并将它关联到一个新的流.

模式
    mode参数用来描述如何打开所指定的文件.它的值可能是下面的齐总一个字符串:
    r    打开文件以备读取.流位于文件开端
    r+     打开文件以备读取和写入.流位于文件开端.
    w    打开文件以备写入,如果文件已存在,他会被截短成零长度;如果文件不存在,则会被创建.流位于文件开端.
    w+     打开文件以备读取和写入.如果文件已存在,他会被截短成零长度;如果文件不存在,则会被创建.流位于文件开端.
    a    打开文件已被写入并且进入附加模式.如果文件不存在,则会创建.流位于文件末端,所写入的数据会被附加到文件末端.
    a+    打开文件以备读取和写入并且进入附加模式,如果文件不存在,则会被创建.流位于文件末端.所写入的数据会被附加到文件末端.
    另外b模式    是要求fopen()以位二进制模式打开文件(linux总是会忽略此值)
    执行成功时,fopen()会返回一个有效的FILE指针;执行失败时,他会返回NULL并且将errno设定为适当的值.

    FILE *stream;
    stream = fopen("/etc/manifest", "r");
    if (!stream)
    /*错误*/


将文件描述符打开流
    函数fdopen()可将一个已打开的文件描述符(fd)转化成流:
#include <stdio.h>
FILE *fdopen(int fd, const char *mode);
mode参数的可能值和fopen()一样,并且必须兼容最初打开文件描述符所使用的模式.
    文件描述符被转化成流之后,就不应该再以文件描述符进行I/O.请注意,文件描述符并未重复,而只是被关联到一个新的流.关闭流的同事也会关闭文件描述符.
    执行成功时,fdopen()会返回一个有效的文件指针;失败时,返回NULL.

    FILE *stream;
    int fd;
    fd = open("/home/kidd/map.txt", O_RDONLY);
    if (fd == -1)
    /* 错误 */
    stream = fdopen(fd, "r");
    if (!stream)
    /* 错误 */



关闭流
    fclose()函数可用于关闭指定流:

#include <stdio.h>
int fclose(FILE *stream);


任何经缓冲而尚未写入磁盘的文件会首先被刷新(flush)到磁盘.执行成功时,fclose()会返回0;失败时会返回EOF并且讲errno设定为适当的值.

关闭所有的流
    fcloseall()函数可用于关闭关联到当前进程的所有流,包括标准输入,标准输出以及标准错误

#define _GNU_SOURCE
#include <stdio.h>
int fcloseall(void);


关闭之后,所有流会被刷新到磁盘.此函数通常返回0,这是linux特有的.

从流中读取
    标准C链接库实现了数个函数(从常见到罕见都有),可用于读取一个已经打开的流.
    本届将介绍三种最常见的错做:一次读取一个字符,一次读取一整行以及读取二进制数据.为了从流中读取,必须以适当的模式打开一个流,也就是w或a除外的任何有效方式.

一次读取一个字符
    函数fgetc()可用于从一个流中读取一个字符:

#include <stdio.h>
int fgetc(FILE *stream);


此函数会从stream读取下一个字符,并把它从unsigned char转型成int并返回.转型的目的是提供足够的空间给end-of-file或错误通知:返回值为EOF就是这种情况.fgetc()的返回值必须存放在int变量中.将他存放在char变量中是一种常见但危险的错误.

int c;

c = fgetc(stream);
if (c == EOF)
    /* 错误 */
else
    printf("c = %c\n", (char)c);


由stream所指向的流必须被打开以备读取.

猜你喜欢

转载自www.cnblogs.com/wuwangchuxin0924/p/9434364.html