UNIX 输入和输出

1、文件描述符

     1)顺序分配的非负整数

     2)内核用以标识一个特定进程正在访问的文件

     3)其他资源(socket、pipe)的访问标识

2、标准输入、标准输出和标准出错     

       stdio stdout stderr

       由shell默认打开,分别为 0\1\2

3、不用缓存的I\O

     1)通过文件描述符进行访问

     2)文件I\O: open read write close lseek

4、标准I\O

    1)  通过FILE*进行访问

    2)printf  fprintf fopen fread fwrite fseek fclose

      标准I\O 库由ANSIC标准说明。

 

标准I\O :

         流和FILE对象:

                          标准I\O库的所有操作都是围绕流(stream)来进行的,在标准I\O中,流用FILE*来描述。

         流(stream): 分为文本流和二进制流

                                文本流: 在处理中数据以字符出现。  "\n" -> CR blabla ....

                                二进制流:流中处理的是二进制序列。字符用ascii码表示。   

         文件缓冲:

                        缓冲文件系统(高级磁盘I\O):

                                  目的:尽量减少文件I/O的调用

                                  分类: 全缓冲、行缓冲(遇到"\n"输出)、不缓冲(stderr)

                               使用setbuf()和setvbuf()可以更改缓存类型,在任意时刻,可以使用fflush强制刷新一个数据流,使缓存数据刷新到内核。

                        非缓冲文件系统(低级磁盘I\O) 文件I/O没有缓存

 

                                  依靠操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出。

标准流的一些操作: freopen函数支持文件流的重定向

                               

             FILE *fopen(const char *path, const char *mode);

             FILE *fdopen(int fd, const char *mode);

             FILE *freopen(const char *path, const char *mode, FILE *stream);

 

mode:

 

打开一个标准I/O流的六种不同方式:

限制rwar+w+a+

文件已经存在

?  ?  
擦出文件以前的内容 ?  ? 
流可以读?  ???
流可以写 ?????

流只可在尾端处写

  ?  ?

fopen要求文件具有0666的权限。 可以通过(0666 &~umask )修改文件的权限 ,或则在bash中使用chmod 命令。

ulimit -a 命令可以查看和修改最大文件数

fclose用于关闭一个已经打开的文件流:

fclose()调用成功返回0,失败返回EOF,并设置errno。

在该文件被关闭之前,刷新缓存中的数据。如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。

当一个进程正常终止时(直接调用exit函数,或从main函数返回)则所有带未写缓存数据的标准I/O流都被刷新,所有打开的标准I\O流都被关闭。

 

读写流:

           每次一个字符的I/O。fgetc()/fputc()

           每次一行的I/O。fgets()feputs()。当调用fgets时,应说明能处理的最大行长

           直接I/O。fread fwrite。可指定读写长度,常用于从二进制文件中读写一个结构

读写流结束判断:

           feof()判断文件是否结束

检查文件出错函数;

       #include <stdio.h>

       void clearerr(FILE *stream);

       int feof(FILE *stream);

       int ferror(FILE *stream);

       int fileno(FILE *stream)

定位流;

       #include <stdio.h>

       int fseek(FILE *stream, long offset, int whence);

       long ftell(FILE *stream);

       void rewind(FILE *stream);

       int fgetpos(FILE *stream, fpos_t *pos);
       int fsetpos(FILE *stream, fpos_t *pos);

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值