UNIX环境高级编程----标准I/O

一.流:当用标准I/O打开或创建一个文件时,我们使一个流与一个文件相关联,当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针,该对象通常是一个结构,它包含了标准I/O库为管理该流所需要的所有信息,包括:用于实际I/O的文件描述符,指向于缓冲区的指针,缓冲区的长度,当前缓冲区中的字符数以及出错标志等。

对于一个进程预定义了三个流,并且这三个流自动的被进程使用,它们是:标准输入、标准输出、标准出错。这三个标准I/O流通过预定义的指针stdin,stdout,stderr加以引用。

二.缓冲

1) 全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作,对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的,在一个流上执行第一次I/O操作时,相关函数通常调用malloc获得需要的缓冲区,调用fflush函数可以冲洗一个流。

2) 行缓冲:当在输入和输出中遇到换行符时, 标准I/O库指向I/O操作。

3) 不带缓冲:标准I/O库不对字符进行缓冲存储。标准出错流stderr通常是不带缓冲的,这就使得初错信息可以尽快的显示出来。

三.打开关闭一个标准I/O流:

#include<stdio.h>

FILE *fopen(constchar *pathname, const char *restrict type);

FILE*freopen(const char *pathname, const char *restrict type, FILE *restrict fp);

FILE fdopen(intfiledse, const char *type);

     (三个函数成功则返回文件指针,出错则返回NULL);

(1)    fopen打开一个指定的文件

(2)    freopen在一个指定的留上打开一个指定的文件,如若该流已经打开,则先关闭该流,若该留已经定向,则freopen清除该定向。

(3)    fdopen获取一个现有的文件描述符,并是一个标准I/O流与该文件描述符相结合。此函数通常用于有创建管道和网络通信通道函数返回的描述符,因为这些特殊类型的文件不能用标准I/O fopen函数打开;

(4)    type参数指定该流I/O的读,写方式

r或rb              为读而打开

w或wb            把文件截短至0长,或为写而创建

a或ab              添加,为在文件尾而写打开,或为写而创建为读和写而打开

r++或r+b或rb+      为读和写而打开

w++或w+b或wb++        把文件截短至0长,或为读和写而打开

a+或a+b或ab++    为在文件尾读和写而打开或创建

关闭一个打开的流

     #include <stdio.h>

     fclose(FILE *fp);(若成功则返回0,若出错则返回EOF)

     在该文件被关闭之前,冲洗缓冲区中的输出数据,丢弃缓冲区中的任何输入数据,如果标准I/O库一件为该流自动分配了一个缓冲区,则释放此缓冲区。

四.流的读写

         每次一个字符I/O

         1. 输入函数

                   #include <stdio.h>

                   int getc(FILE *fp);

                   int fgetc(FILE *fp);

                   int getchar(void);

                            (三个函数成功返回下一个字符,若已到达文件结尾或出错返回EOF);

                   getchar等价于getc(stdin),getc可以实现为宏,而fgetc则不能实现为宏,所以可以将fgetc的地址作为参数传递给另一个函数。

                   注意,不管是出错还是到达文件尾端,这三个函数都是返回同样的值,为了区分这两种不同的情况,必须调用ferror或feof

                   #include <stdio.h>

                   int ferror(FILE *fp);

                   int feof(FILE *fp);(若条件为真返回非0值,否则返回0);

                   void clearer(FILE *fp)

         2. 输出函数

                   #include <stdio.h>

                   int putc(int c, FILE *fp);

                   int fputc(int c, FILE *fp);

                   int putchar(int c);

                            (这三个函数成功则返回c, 出错则返回EOF)

                   与输入函数一样,putchr(c)等效于putc(c,stdout),putc可以事先为宏

每次一行I/O

1.      输入函数

#include <stdio.h>

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

char *gets(char *buf);

两个函数 成功则返回buf, 到达文件结尾或者出错返回NULL

这两个函数都指定了缓冲区地址,读入的行将送入其中,gets从标准输入读,而fgets则从指定的流读。

对于fgets必须指定缓冲区的长度n, 此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入缓冲区,该缓冲区以null字符结尾,而gets不能指定缓冲区的长度,这样就可能造成缓冲区溢出,不推荐使用。

2.      输出函数

#include <stdio.h>

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

int puts(const char *str);

                fputs 将一个以null符终止的字符串写到指定的流,尾端的终止符null不写出。                    puts将一个以null符终止的字符串写到标准输出,终止符不写出,但是puts然后又将一个换行符写到标准输出。

     直接I/O

              #include <stdio.h>

              size_t fread(void restrict ptr,size_t size, size_t nobj, FILE *restrict fp);

              size_t fwrite(const void *restrictptr, size_t size size_t nobj, FILE *restrict fp);

              size为每个元素的长度, nobj为欲写元素个数

                                 两个函数的返回值:读或写的对象数

              函数使用场合:

1)  读写一个二进制数组,列如,为了将一个浮点数组的第2~5个元素写到一个文件上

float data[10];

if(fwrite(&data[2],sizeof(float), 4, fp) != 4)

           printf(“fwriteerror:%s\n”, strerror(errno));

2)  读写一个结构

struct{

short count;

long total;

char name[NAMESIZE];

}item;

If(fwrite(&item, sizeof(item), 1, fp) != 1)

Printf(“fwriteerror:%s\n”, strerror(errno));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值