I/O

UNIX I/O(系统I/O)
      通常被称为不带缓存的I/O,不带缓存指的是每个 r e a d和w r i t e都调用内核中的一个系统调用,这些不带缓存的I / O函数不是ANSI C的组成部分,但是是P O S I X . 1和X P G 3的组成部分。所有I / O函数都是针对文件描述符的。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符,对于内核而言,所有打开文件都由文件描述符引用。
      惯例:    #include<unistd.h> 
                   0——STDIN_FILENO、1——STDOUT_FILENO、STDERR_FILENO
打开:
#include <fcntl.h>; //第二个参数
#include <sys/types.h>;
#include <sys/stat.h>;
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
返回 fd或-1
pathname是我们要打开的文件名
flags可以去下面的一个值或者是几个值的组合
O_RDONLY:以只读的方式打开文件.
O_WRONLY:以只写的方式打开文件.
O_RDWR:以读写的方式打开文件.
O_APPEND:以追加的方式打开文件.
O_CREAT:创建一个文件. //必须指名第三个参数
O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误.
O_NOBLOCK:以非阻塞的方式打开一个文件.
O_TRUNC:如果文件已经存在,则删除文件的内容.
int create(const char* pathname,mode_t mode);
//在提供open函数后,该函数用open(pathname,O_RDWR|O_CREAT|O_TRUNC,mode)代替。
关闭:
#include<unistd.h>
int close(int fd);
定位:
#include <sys/types.h>
#include <unistd.h>
off_t  lseek(int  fd, off_t  offset,  int whence) ;
返回:若成功为新的文件位移,若出错为- 1
         * 若whence是SEEK_SET——0,则将该文件的位移量设置为距文件开始处offset 个字节。 
         * 若whence是SEEK_CUR——1,则将该文件的位移量设置为其当前值加offset, offset可为正或负。
         * 若whence是SEEK_END——2,则将该文件的位移量设置为文件长度加offset, offset可为正或负。
读写:
用read函数从打开文件中读数据。
#include <unistd.h> ssize_t read(int fd,void *buff,size_t,nBytes) ;
返回:读到的字节数,若已到文件尾为0,若出错为-1 用write函数向打开文件写数据。
#include <unistd.h> ssize_t write(int fd,const void *buff, size_t  nBytes) ;
返回:若成功为已写的字节数,若出错为- 1
文件共享:  
dup、dup2:   fcntl:  
标准I/(OANSI C I/O) :
对于标准I/O库,它们的操作则是围绕流(stream)进行的 0——STDIN_FILENO、1——STDOUT_FILENO、STDERR_FILENO用来表示文件描述符的常量定义在unistd.h中,三个标准I / O流通过预定义文件指针stdin,stdout和stderr加以引用。这三个文件指针同样?定义在头文件< stdio.h>中。标准I/O库最终都要调用系统I/O例程。每个I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno以获得其描述符。
#include <stdio.h>
int fileno(FILE *f p) ;
返回:与该流相关联的文件描述符
缓存既是标准I/O的优点同时也是让人迷惑的地方。全缓存、行缓存、不带缓存除非流引用终端设备,否则按系统默认,它被打开时是全缓存的。若流引用终端设备,则该流是行缓存的。一旦打开了流,那么在对该流执行任何操作之前,如果希望,则可使用setbuf、setvbuf改变缓存的类型。
#include <stdio.h>
void setbuf(FILE *f p,  char *b u f) ;
int setvbuf(FILE * f p,  char *b u f,  int m o d e,  size_t s i z e) ;
返回:若成功则为0,若出错则为非0
打开流:
#include <stdio.h>
FILE *fopen(const char *pathname, const char *type);
// fopen打开路径名由pathname指示的一个文件
FILE *freopen(const char * pathname, const char * type, FILE *f p) ;
// 将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准出错。
FILE *fdopen(int fd, const char * type) ;
// fdopen取一个现存的文件描述符,并使一个标准的I / O流与该描述符相结合。用于由创建管道和网络通信通道函数获得的描述符。首先必须先调用设备专用函数以获得一个文件描述符,然后用fdopen使一个标准I / O流与该描述符相结合。POSIX才有,ANSI C没有。
三个函数的返回:若成功则为文件指针,若出错则为NULL。
type说明
r 或rb为读而打开
w 或wb使文件成为0长,或为写而创建
a或ab添加为在文件尾写而打开,或为写而创建
r+或r+b或 rb +为读和写而打开
w+或w+b或 wb +使文件为0长,或为读和写而打开
a+或a+b或ab +为在文件尾读和写而打开或创建调用fclose关闭一个打开的流。
#include <stdio.h>
int fclose(FILE *f p) ;
返回:若成功则为0,若出错则为EOF
读和写流:
每次一个字符的I/O
读:
#include <stdio.h>
int getc(FILE *f p) ;
int fgetc(FILE *f p) ;
int getchar(void);
三个函数的返回:若成功则为下一个字符,若已处文件尾端或出错则为EOF 不管是出错还是到达文件尾端,这三个函数都返回同样的值。为了区分这两种不同的情况,必须调用f e r r o r或f e o f。
在大多数实现的F I L E对象中,为每个流保持了两个标志:
* 出错标志。
* 文件结束标志。
#include <stdio.h>
int ferror(FILE * f p) ;
int feof(FILE *f p) ;
两个函数返回:若条件为真则为非0(真),否则为0(假)
void clearerr(FILE *f p) ;//清楚上面所说的两个标志
输出:
#include <stdio.h>
int putc(int c, FILE *f p) ;
int fputc(int c, FILE *f p);
int putchar(int c) ;
三个函数返回:若成功则为C,若出错则为EOF 每次一行的I/O
输入:
#include <stdio.h>
char *fgets(char * b u f, int n,FILE *f p) ;
char *gets(char *b u f) ;
两个函数返回:若成功则为b u f,若已处文件尾端或出错则为N U L L
输出:
#include <stdio.h>
int fputs(const char *s t r, FILE *f p) ;
int puts(const char *s t r) ;
两个函数返回:若成功则为非负值,若出错则为 E O F
直接I/O(二进制I/O)
#include <stdio.h>
size_t fread(void *p t r, size_t s i z e, size_t n o b j, FILE *f p) ;
size_t fwrite(const void *p t r, size_t s i z e, size_t n o b j, FILE *f p) ;
两个函数的返回:读或写的对象数定位流
#include <stdio.h> int fgetpos(FILE *f p, fpos_t *p o s) ;
int fsetpos(FILE *f p, const fpos_t *p o s) ;
两个函数返回:若成功则为0,若出错则为非0
格式化I/O
输出:
#include <stdio.h>
int printf(const char *format, ...);// printf将格式化数据写到标准输出
int fprintf(FILE * f p, const char *format, ...);
// f printf写至指定的流
两个函数返回:若成功则为输出字符数,若输出出错则为负值
int sprintf(char *b u f, const char *format, ...); // sprintf将格式化的字符送入数组b u f中
返回:存入数组的字符数
输入:
#include <stdio.h> int scanf(const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
int sscanf(const char *buf, const char *format, ...);
三个函数返回:指定的输入项数,若输入出错,或在任意变换前已至文件尾端则为EOF  
C++ I/O
I/O类型在三个独立的头文件中定义:iostream,fstream,sstream IO对象不可复制或赋值
IO的条件状态:
s.eof(),s.fail(),s.bad(),s.good(),s.clear()……
输出缓冲区管理:endl,ends,flush,unitbuf
设备I/O  
 
文件I/O
打开:可以通过构造或通过open打开
ifstream infile(ifile.c_str());
ofstream outfile;
outfile.open(“out”);
//IO标准库使用C风格字符串
//可以将文件流与新文件重新捆绑文件模式: in,out,app,ate,trunc,binary
//out,app,trunc只能用于指定fstream和ofstream
//in只能用于指定fstream和ifstream
//ate和binary可用于全部
//模式是文件的属性而不是流的属性文件模式的有效组合:
out/out|trunk,out|app,in,in|out,in|out|trunk
string I/O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值