UNIX 标准文件编程库
在UNIX的应用中,读写文件是最常见的任务。标准文件编程库就是操作文件最简单的工具。
在标准编程库对文件流的输入输出操作非常灵活,我们既可以采用所见即所得的方式,以五个是方式读写文件,又可以对所输入和输出的数据进行转化,以有个是方式读写文件。
文件的无格式读写
无格式读写分为三类: 按字符、行、块进行读写
按字符读写函数有:
#include <stdio.h>
int getchar(void);
int getc(FILE *stream);
int fgetc(FILE *stream);
int ungetc(int c, FILE *stream);
int putchar(int c);
int putc(int c, FILE *stream);
int fputc(int c, FILE *stream);
注意:fgetc的功能类似于getc, 不同的是,它的执行速度远低于getc.
按行读写函数有:
#include <stdio.h>
char *gets(char *s);
chat *fgets(char *s, int n, FILE *stream);
int puts(const char*s);
int fputs(const char *s, FILE *stream);
函数fgets中加入了防溢出控制,应该优先选用,注意函数fputs把字符串s(不包括结束符'/0')写入文件流stream中,但不再
输出换行符'/n';而函数puts则自动输出换行符。
块读写函数:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
函数fread和fwrite都不返回实际读写的字符个数,而是返回的是实际读写的数据项数。块读写函数常用于保存和恢复内存数据。
文件的格式化读写
文件格式化读写时能够自动转换的数据格式有:数据类型,精度,宽度,进制和标志等,而其一般格式为%[标志][宽度][.精度]类型
格式化输出函数:
#include <stdio.h>
int printf(const char *format, /*[arg,]*/ ...);
int fprintf(FILE *stream, const char *format, /*[arg,]*/ ...);
int sprintf(char *s, const *format, /*[arg,]*/ ...);
在做字符串处理是应该善用sprintf函数
格式化输入函数:
#include <stdio.h>
int scanf(const char formant, /*[pointer,]*/ ...);
int fscanf(FILE *stream, const char format, /*[pointer,]*/ ...);
int sscanf(const char *s, const char format, /*[pointer,]*/ ...);
二进制读写与文本读写
刚开始学习C语言时,使用fopen函数是需要制定操作类型,比如文本读'r'和二进制写'rb'.
那么他们究竟有何区别呢?这要牵涉到两种存储方式:以字符为单位存储的文本文件和以二进制数据为单位存储的二进制文件。例如:我们通常阅读的Readme.txt 文件就是文本文件,该类型文件存储的是一个一个的字符,这些字符往往是可以打印的;而我们的可执行程序则是二进制文件,该文件是不可读的,需要解析才能识别。
那么在调用fopen函数时该如何选择呢?如果你先写入再从另一个地方读出,那么两种方式都可以:只要按写入时的方式读取就可以了。但是,比起文本方式,二进制方式在保存信息时有着优势:
a)加快了程序的执行速度,提高了软件的执行效率。内存中存储的都是二进制信息,直接以二进制方式与文件交互,可以免除二进制格式与文本格式之间的信息转换过程。
b)节省了存储空间。一般来讲,二进制信息比文件信息占用更少的空间,比如8位的整数采用文本方式储存至少需要8字节,而采用二进制只需一个整型即4个字节。