标准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
分享到:
相关推荐
本文将深入探讨Linux中的文件IO和标准IO,以及它们之间的差异。首先,我们从基本概念出发,理解这两种IO方式。 **文件IO**是Linux系统中最常见的IO模型,它基于系统调用接口,如`open()`, `read()`, `write()`, `...
系统 IO 和标准 IO 的连续与区别 系统 IO 和标准 IO 是两种不同的文件 Input/Output 模式,它们之间有着紧密的联系,但也存在着一些关键的差异。在本文中,我们将详细介绍系统 IO 和标准 IO 的定义、特点、函数调用...
在Linux操作系统中,标准输入/输出(Standard Input/Output,简称标准IO)是系统提供的一种基本I/O模型,用于程序与外部设备之间的数据传输。在这个案例中,我们关注的是如何利用标准IO进行学生信息的管理。`ls_stu....
### C++标准IO知识点详解 #### 一、C++标准IO概述 C++标准库提供了丰富的输入输出(IO)功能,这些功能通过一系列面向对象的API实现,支持对各种设备如控制台、文件等的读写操作。这些API还包括一些特殊类型,允许...
在编程领域,标准IO库(Standard Input/Output Library)是C++编程语言中不可或缺的一部分,它为处理输入和输出提供了一套完整的接口。QT库,另一方面,是一个强大的跨平台应用程序开发框架,尤其在图形用户界面...
通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;通过C语言用标准IO实现文件打复制;
文件IO 文件操作 操作文件 标准IO和文件IO 文件IO是计算机系统中最基本的输入/输出操作之一,它允许程序访问和操作文件。文件IO可以分为两大类:标准IO和文件IO。标准IO是指使用标准输入输出流来读取和写入文件,而...
标准输入输出是ANSI C建立的一个标准IO模型,是一个标准函数包和stdio.h头文件中的定义。标准IO库处理很多细节,例如缓存分配,以优化长度执行IO等。标准IO提供了三种类型的缓存:全缓存、行缓存和不带缓存。全缓存...
无缓存I/O操作与标准I/O文件操作之间的主要区别在于数据处理的层次和缓存机制。系统调用是操作系统内核提供给应用程序的一种接口,允许应用程序请求内核执行特定的任务,如I/O操作。在I/O操作中,无论是无缓存还是...
标准IO(Standard Input/Output)是C语言中处理输入输出的标准库,包括了如fopen、fclose、fprintf等函数。这篇文档主要探讨了如何在套接字通信中结合使用标准IO函数,以及其优缺点和相关的转换方法。 首先,套接字...
使用fread/fwrite函数完成如下功能: 提示用户任意输入,将用户输入的信息存储到 abc.txt 文件中 当用户输入"quit"的时候程序退出。
【Java中的标准IO方法】是Java编程中处理输入输出的基础,尤其对于初学者而言,掌握这些方法至关重要。Java提供了一系列的类和方法来处理输入输出流,主要包括`System.in`,`Scanner`以及`BufferedReader`。 一、...
标准io流复制文件
适用于编程初学者,不给你们看
Java标准IO流编程是Java平台基础且至关重要的部分,它提供了对输入输出数据进行操作的能力。I/O(Input/Output)涉及从外部源(如文件、网络连接等)读取数据,以及向这些源写入数据。在Java中,IO流被设计成一个流...
这些信号的处理是通过标准IO信号板完成的,其中DSQC652是ABB机器人常用的一种IO板,主要用于处理数字量输入和输出。 DSQC652是一款具有16个数字量输入和16个数字量输出点的IO板,它的设计目的是方便机器人与环境中...
C++标准IO库,通过C++标准输入输出流对控制窗口,磁盘文件字符串流进行控制。内容也包含条件状态,文件模式等内容。
数据结构小项目 单链表 标准IO
标准io流获取文件长度
大型自动化设备工作台标准IO配置表 - A02020_06_17