`

标准IO

    博客分类:
  • Unix
阅读更多
标准I/O的的操作则是围绕stream进行的。

当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。
流的定向决定了所读、写的字符时单字节还是多字节。
只有两个函数可以改变流的定向
   * 1、freopen函数清除一个流的定向
   * 2、fwide函数设置流的定向
#include <stdio.h>
#include <wchar.h>

int fwide (FILE *fp, int mode);

返回值:若流时宽定向则返回正值,若是字节定向则返回负值。未定向则返回0;

当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构,它包含了标准I/O库为管理该流所需要的所有信息,包括:用于实际I/O的文件描述符、指向用于该流缓冲区的指针,缓冲区的长度、当前在缓冲区中的字符数以及出错标志等。
标准I/O提供缓冲的目的时尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理。
STDIO提高了三种缓冲:
1)全缓冲
在这种情况下,在填满IO缓冲区后才进行实际的IO操作。对于驻留在磁盘上的文件通常是由标准IO库实现全缓冲的。在一个流上执行第一次IO操作时,相关标准IO函数通常调用malloc获得所使用的缓冲区。
2)行缓冲
在这种情况下,当在输入和输出中遇到换行符时,标准IO库执行IO操作,这允许我一次输入一个字符,但只有在写了一行之后才进行实际IO操作,当流涉及一个终端时候,通常使用行缓冲。
3)不带缓冲
标准IO库不对字符进行缓冲存储。

IOS C要求下列缓冲特征。
  •    * 当且仅当标准输入和标准输出并不涉及交互式设备时,他们才是全缓冲。
  •    * 标准出错绝不会是全缓冲的
  •    * 标准出错是不带缓冲的
  •    * 如若是设计终端设备的其他流,则他们是行缓冲的,否则是全缓冲的。

对任何一个给定的流,如果我们需要修改系统默认的情况,则可调用下列两个函数中的一个更改缓冲类型:
#include <stdio.h>

void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);


可以使用setbuf函数打开或关闭缓冲机制。
使用setvbuf,我们可以精确地指定所需的缓冲类型。

mode参数实现的:
  • _IOFBF(full buffer)
  • _IOLBF(line buffer)
  • _IONBP(no buffer)

任何时候,我们都可强制冲洗一个流。
#include <stdio.h>
int fflush(FILE *fp);

打开流的三个函数
#include <stdio.h>

FILE *fopen(const char *restrict pathname, const char * restrict type);
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *fdopen(int filedes, const char *type);

返回值:若成功则返回文件指针,若出错则返回NULL。

区别:
  • fopen打开一个指定的文件
  • freopen在一个制定的流上打开一个指定的文件。
  • fdopen获取一个现有的文件描述符(我们可能从open、dup、dup2、fcntl、pipe、socket、socketpair或accept函数得到此文件描述符),并使一个标准的IO流与该FD相结合。

使用fclose关闭一个打开的流。
#include <stdio.h>
int fclose(FILE *fp);

读和写流
以下三个函数可用于一次读一个字符。
#include <stdio.h>

int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);

返回值:若成功则返回下一个字符,若已到文件结尾或出错则返回EOF。
getchar等价于getc(STDIN)。

输出函数
#include <stdio.h>

int putc(int c, FILE *fd);
int fputc(int c, FILE *fd));
int putchar(int c);

putchar(c)等价于putc(c,STDOUT)
下面两个函数提供每次输入一行的功能
#include <stdio.h>

char *gets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);

对应输出
#include <stdio.h>

int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);


二进制IO

#include <stdio.h>

size_t freed(void *restrict ptr, size_t size, size_t nobj,FILE *restrict fp);
size_t write(const void *restrict ptr, size_t size, size_t nobj,FILE *restrict fp);

返回值:读或者写的对象数目,即size_t nobj。

格式化I/O

#include <stdio.h>

int printf(const char *restrict format,….);
int fprintf(FILE *restrict fp,const char *restrict format,….);
int sprintf(char *restrict buf,const char *restrict format,….);
int snprintf(char *restrict buf, size_t n,const char *restrict format,….);

  • printf将格式化的数据写到STDOUT
  • fprintf写到制定的stream
  • sprintf将格式化的字符送入数组buf中

#include <stdio.h>

int scanf(const char * restrict format,…);
int fscanf(FILE *restrict fp, const char *restrict format,…);
int sscanf(const char *restrict buf, const char *restrict format,….)

Implements:
每个STDIO流都有一个与其相关联的fd,可以对一个stream调用fileno函数获得fd。
#include <stdio.h>
int fileno(FILE *fp);

如果要调用dup和fcntl等函数,则需要此函数。



Others:

sync、fsync、fdatasync函数
传统的UNXI实现在内核中设有高速缓冲区高速缓存或者页面高速缓存,大多数磁盘IO都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则不将其排入输出队列,而是等待其写完或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出queue。然后待其到达队首时,才进行实际的io操作。这种输出方式被称为延迟写

延迟写减少了磁盘的读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内没有写到磁盘上。当系统发生故障时,这种延迟写可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与高速缓冲区高速缓存内容的一致性,UNIX提供了sync、fsync、fdatasync三个函数。
#include <stdio.h>

int fsync(int fieldes);
int fdatasysc(int fieldes);
void sync(void);

返回值:成功返回0,出错返回-1
  • sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它病不等待实际磁盘操作结束。
  • 通常被称为update的系统守护进程会周期性地调用sync函数这就保证顶起冲洗内核的块缓冲区。
  • fsync函数只对由fd指定的单一文件起作用,并且等待起磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保修改的块立即写到磁盘上
  • fdatasync函数类似fsync,但它只影响文件的数据部分,而除数据外,fsync还会同步更新文件的属性。




参考资料:

http://en.wikipedia.org/wiki/C_file_input/output
分享到:
评论

相关推荐

    C++标准IO文档

    C++标准IO 2 1.面向对象的标准库 2 2.流的状态 4 1.流状态 4 2.流状态的使用 4 3.缓存的管理 5 1.刷新输出缓冲区 5 2.输入和输出绑定 6 4.文件IO 6 1.类与对象 6 2.函数调用 7 1.文件模式 7 2.open函数 8 3.close...

    Linux文件IO跟标准IO总结

    文件中详细描述了,Linux中的文件IO内容,跟标准IO内容详解,以及两者之间的区别,并进进行了比较,新人比较容易看明白

    标准IO实现文件的复制

    通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;

    系统IO跟标准IO的连续与区别

    学了这么久的文件IO了,总是不知道什么时候该用系统IO,什么时候该用标准IO,今天就来整理整理,并分享出来

    标准IO库与QT流的使用.7z

    标准IO库与QT流的使用

    无缓存IO操作和标准IO文件操作区别

    非常详细的讲解清楚系统调用IO和文件IO 的区别,以及缓存的意义

    通过标准IO输入文件,输入quit退出

    使用fread/fwrite函数完成如下功能: 提示用户任意输入,将用户输入的信息存储到 abc.txt 文件中 当用户输入"quit"的时候程序退出。

    认识ABB机器人的标准IO信号板-DSQC652.pdf

    认识 认识ABB机器⼈的标准 机器⼈的标准IO信号板 信号板-DSQC652 机器⼈通常需要接收其它设备或传感器的信号才能完成指派的⽣产任务,⽐如:要将板链上某个货物搬运到另 ⼀个地⽅,⾸先就要确定货物是否到达了指定的...

    c++标准IO实例示范

    c++标准IO示范c++标准IO示范c++标准IO示范c++标准IO示范实例讲解各个流的基本用法 c++标准IO示范c++标准IO示范c++标准IO示范c++标准IO示范实例讲解各个流的基本用法 c++标准IO示范c++标准IO示范c++标准IO示范c++标准...

    文件IO 文件操作 操作文件 标准IO和文件IO

    文件IO 文件操作 操作文件 标准IO和文件IO

    标准io流复制文件

    标准io流复制文件

    Java中的标准IO方法

    Java中的标准IO方法,详尽的java io操作,io学习必不可少的资料。

    linux 标准IO——学生信息管理

    linux 标准IO——学生信息管理 作业 ls——stu。c linux 标准IO——学生信息管理 作业 ls——stu。c linux 标准IO——学生信息管理 作业 ls——stu。c

    高级编程笔记文件io/标准io.txt

    适用于编程初学者,不给你们看

    Linux系统IO与标准IO.pdf

    Linux系统IO与标准IO的具体使用介绍,摘自Linux 环境编程图文指南

    深究标准IO的缓存

    在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?

    嵌入式系统/ARM技术中的标准IO与文件IO 的区别

     先来了解下什么是标准IO以及文件IO。  标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度...

    XMind总结C++标准IO库

    C++标准IO库,通过C++标准输入输出流对控制窗口,磁盘文件字符串流进行控制。内容也包含条件状态,文件模式等内容。

    标准io流获取文件长度

    标准io流获取文件长度

    套接字和标准IO1

    套接字和标准IO1

Global site tag (gtag.js) - Google Analytics