前言
在上一篇文章中上一篇文章文件操作知识大全(上),我们学习了文件操作的相关知识,比如顺序读写,文件的打开与关闭,文件指针等等。今天我们再来补充一些常用的知识点!
一、文件的随机读写
1、fseek函数:
根据文件指针的位置和偏移量来定位文件指针
函数格式:
int fseek(FILE* stream, long int offset, int origin);
注意事项:
其中“ offset ”为相对于指针位置的指针偏移量。
其中“ origin ”为指针位置,其参数有三种:
“ SEEK_CUR ”表示文件指针当前位置;
“ SEEK_END ”表示文件末尾的位置;
“ SEEK_SET ”表示文件开始位置。
int main() { FILE* pf = fopen("test.txt", "w"); fputs("abcd", pf); fclose(pf); pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); } else { int ch = fgetc(pf); printf("%c\n", ch);//a ch = fgetc(pf); printf("%c\n", ch);//b ch = fgetc(pf); printf("%c\n", ch);//c //如果继续往下读,必然是d //但是我们调整一下,去读取:b //fseek(pf, -2, SEEK_CUR); fseek(pf, 1, SEEK_SET); ch = fgetc(pf); printf("%c\n", ch);//b } return 0; }
运行结果:
2、ftell函数:
返回文件指针相对于起始位置的偏移量
函数格式:
long int ftell(FILE* stream);
3、rewind函数:
让文件指针的位置回到文件的起始位置(其实相当于fseek(stream,0,SIZE_SET))
函数格式:
void rewind(FILE* strname);
4、综合使用:
int main() { FILE* pf = fopen("test.txt", "w"); fputs("abcd", pf); fclose(pf); pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); } else { int ch = fgetc(pf); printf("%c\n", ch);//a ch = fgetc(pf); printf("%c\n", ch);//b ch = fgetc(pf); printf("%c\n", ch);//c //如果继续往下读,必然是d //但是我们调整一下,去读取:b //fseek(pf, -2, SEEK_CUR); fseek(pf, 1, SEEK_SET); ch = fgetc(pf); printf("偏移一个字符后是%c\n", ch);//b printf("总共便宜了%d\n个位置", ftell(pf)); rewind(pf); ch = fgetc(pf); printf("回到起始位置后是%c\n", ch);//a } return 0; }
运行结果:
二、文本文件与二进制文件:
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
所以,一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。
我们举个栗子:
int main() { int a = 10000; FILE* p = fopen("test.txt", "wb"); //“wb”表示以只写模式打开二进制文件 if (p == NULL) { perror("FileOpen"); return 0; } fwrite(&a, 4, 1, p); //将变量a中的数据,每四个字节存储一次,写入文件指针p所指向的文件 fclose(p); p = NULL; return 0; }
通过文本文件发现看不懂:
其实原因大家都知道,我们是以2进制的形式传进去的,文本文件就以这个2进制打印了字符。所以我们现在来用二进制形式看看该文件(16进制)!
每四个字节进行划分:
0000 0000 0000 0000 0010 0111 0001 0000
于是得到:
00 00 27 10
又因为我们的vs是小端存储,于是在进行压栈时会将数据进行倒置存储,于是就有了该结果。