读写流 -- 非格式化IO

2014-07-25 13:21:08   最后更新: 2014-07-25 13:21:08   访问数量:801




一旦打开了流,则可以在三种不同类型的非格式化IO中进行选择,对其进行读写操作:

  1. 每次一个字符的IO
  2. 每次一行的IO
  3. 一次读或写一行,则使用 fgets 和 fputs,每行以一个换行符终止。

  4. 直接IO(二进制IO)
  5. fread 和 fwrite 函数支持直接的IO操作,每次IO读或写固定数量的对象,这两个函数常用于从二进制文件中每次读或写一个结构

 

1、输入函数

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

 

定义于stdio.h头文件中,若成功则返回下一个字符,若已到达文件结尾或出错则返回EOF

 

  • 区别:

  1. getchar等价于getc(stdin)
  2. getc可以被系统实现为宏,而fgetc不行,这意味着,fgetc一定是一个函数,而getc可能是一个宏,因此fgetc可以取得函数地址并作为另一个函数的参数,但fgetc的调用时长可能会长于getc

 

  • 为了判断返回EOF时函数是否出错,必须调用 ferror 或 feof 函数
int ferror(FILE *stream); int feof(FILE *stream);

 

定义于stdio.h头文件中,条件为真则返回非0值,条件为假则返回0

 

  • 可以调用 clearerr 函数清除错误标志和EOF标志
void clearerr(FILE *stream);

 

 

  • 我们也可以用ungetc函数将字符压送回流中,下一次读取时即可读到,但读出顺序与压送顺序相反
int ungetc(char c, FILE *stream);

 

若成功调用返回c,否则返回EOF

当文件到达EOF时,依然可以压回字符,此时压回的字符在EOF之前,即下一次读取时会读到c,下下次读取时会读到EOF标志

这个函数常常被用于你需要查看下一个字符,以便根据字符的值之后确定对该字符的处理,这样,压回后下一次即可读出该字符

 

2、输出函数

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

 

定义于stdio.h头文件中,若调用成功则返回c,否则返回EOF

 

他们的用法和区别与对应的get函数非常类似

 

1、输入函数

char *fgets(char *buf, int n, FILE *stream); char *gets(char *buf); //不推荐使用

 

定义于stdio.h头文件中,调用成功返回buf首地址,到达文件尾端或出错返回NULL

 

从指定的流(gets从标准输入读)读取一行存入buf中。

对于fgets,必须指定缓冲区长度n,而读取结果保证以\0结尾,所以读取的字符数不会超过n-1,如果一行字符数小于n-1,则将这一行字符存入buf,如果一行字符大于n-1,则存入n-1个字符,下一次fgets会继续读取这一行

gets是不被推荐的函数,因为可能会导致缓冲区溢出

 

2、输出函数

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

 

定义于stdio.h头文件中,若成功返回非负值,否则返回EOF

 

fputs将一个以\0结尾的字符串写入流,但不在流中写入最后的\0且不一定会添加换行符

puts将以\0结尾的字符串写入标准输出,与gets不同,他是安全的,但是依然要避免使用,因为puts一定会在写入字符串后写入换行符,如果一次读入不足一行,则会在这个地方被意外的分成两行(缓冲区小于一行中字节数的情况)

 

有时,我们需要一次读或写整个结构,对于getc和putc,读或写一个结构就必须要循环整个结构,麻烦而费时,因此提供了一下两个函数:

size_t fread(void *buffer, size_t size, size_t count, FILE *stream); size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

 

定义于stdio.h头文件中,返回读或写的对象数

通常,这些函数用于两种用法:

1、读或写一个二进制数组

e.g. 将一个浮点数组的第2-5个元素写至文件

float data[10]; if (fwrite (&data[2], sizeof (float), 4, fp) != 4) err_sys ("fwrite_error");

 

2、读或写一个结构

struct { short count; long total; char name[NAMESIZE]; } item; if (fwrite(&item, sizeof (item), 1, fp) != 1) err_sys ("fwrite_error");

 

 






读书笔记      linux      unix      c++      cpp      c语言      龙潭书斋      apue      unix环境高级编程      io      stream            getc      getchar      fgetc      putc      putchar      fputc      fgets      gets      fputs      puts      fread      fwrite     


京ICP备15018585号