|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1、从文本流与二进制流到文本文件与二进制文件
流: 在声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。
while((getc(fp))!=EOF) putchar(ch);
看这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。
C 语言把这个文件指针称为流,其含义是表达该指针会自动移动来方便读写文件。
所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,'/n'被换成回车CR和换行LF的代码0DH和0AH。而当输出时,则0DH和0AH本换成'/n'。
二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对/n符号不进行变换。例如2001这个数,在文本流中用其ASCII码表示为:
'2' '0' '0' '1'
| | | |
50 48 48 49
共占4字节。而在二进制流中则表示为:00000111 11010001 用十六进制就是07D1,只占两字节。
计算机中数据都是以二进制存储的,文本流和二进制流的本质在于程序处理数据的方式不一样,而在选择读写模式后,流会自动帮你处理。
二进制流处理的文件是二进制文件,文本流处理的文件是文本文件。它们在文件的组织形式上也不一样,二进制文件有文件头(File Header),用以表明文件的大小、类型等信息,程序在处理二进制文件时一般会先分析文件头,判断文件是否合法,也就是说,文件头后面的数据才是程序真正要处理的;字符文件没有文件头,第一个字节就是要显示的内容。
2、文件读写函数
1.按字节读写
int fgetc(FILE *stream) ;
int fputc(int char, FILE *stream);
2.按行读写
char *fgets(char *str, int n, FILE *stream); // fgets:读取一行(包括'\n'), 并在结尾自动加上'\0',如果正常执行则返回传入的buf指针
int fputs(const char *str, FILE *stream);
fget()函数采用内存打包技术,把内存首地址str和内存块的大小n一块传给被调函数,这样在被调函数内便可很好的操作主调函数分配的内存空间。
3.按块读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); //从给定流 stream 读取数据(size*nmemb个字节)到 ptr 所指向的内存空间;
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); // 把 ptr 所指向的内存空间中的(size*nmemb个字节)数据写入到给定流 stream 中.
统一使用:
size_t fread(void *ptr, n, 1, FILE *stream); //从给定流 stream 读取数据n个字节到 ptr 所指向的内存空间;
size_t fwrite(const void *ptr, n, 1, FILE *stream); // 把 ptr 所指向的内存空间中的n个字节数据写入到给定流 stream 中.
3、文件其他操作
1.打开文件
FILE *fopen(const char *filename, const char *mode);
模式优先选用:"a+", "ab+"; 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留)。
2.关闭文件
int fclose(FILE *stream);
关闭流 strea关闭流 stream,刷新所有的缓冲区。
3.文件结束标志
int feof(FILE *stream);
测试给定流 stream 的文件结束标识符,结束则返回0.
4.重设文件指针
int fseek(FILE *stream, long int offset, int whence);
设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
whence参数可选: SEEK_SET-->文件的开头; SEEK_CUR-->文件指针的当前位置 ; SEEK_END-->文件的末尾
5.重置文件指针
void rewind(FILE *stream);
设置文件位置为给定流 stream 的文件的开头。
6.获取文件位置
long int ftell(FILE *stream);
返回给定流 stream 的当前文件位置。
4、格式化输入输出
1.格式化输出到文件。
int fprintf(FILE *stream, const char *format, ...);
发送格式化输出到流 stream 中。传送门
2.格式化输出字符串
int sprintf(char *str, const char *format, ...);
发送格式化输出到 str 所指向的字符串。传送门
3.格式化读取文件
int fscanf(FILE *stream, const char *format, ...);
从流 stream 读取格式化输入。传送门
4.格式化读取字符串
int sscanf(const char *str, const char *format, ...);
从字符串读取格式化输入。传送门 |
|