文件操作
文件操作
目录
二进制文件和文本文件
- 二进制文件是一种字节序列,没有字符变换,其中的数据以二进制存储
- 文本文件是一种字符序列,其中的数据以ASCII码存储
存储数据123
时占用空间:
二进制文件: 00000000 01111011
123(bin)
文本文件: 00110001 00110010 00110011
"1" "2" "3"
文件的打开与关闭
打开文件
fopen()
函数,返回值为文件指针,若返回为NULL则表示文件不存在。
函数原型:
FILE *fopen(const char *filename, const char *mode);
在stdio.h
中定义了结构体 FILE。
// 例子:只读打开"D:\\text.txt"(首先确保此文件存在)
FILE *fp = fopen("D:\\text.txt", "r");
关闭文件
fclose()
函数,当关闭成功时返回0
,否则返回非0
值。
函数原型:
int fclose(FILE *fp);
文件读写
按字符读写文件
读出字符fgetc()
函数fgetc()
用于从一个以只读或读写方式打开的文件上读字符。
函数原型:
int fgetc(FILE *fp);
// fp是函数 fopen() 返回的文件指针
若读取成功,则返回该字符;若读到文件末尾,则返回EOF
(一个符号变量,在stdio.h
中定义为-1)
写入字符fputc()
函数fputc()
用于将一个字符写入一个文件
函数原型:
int fputc(int c, FILE *fp);
// fp是函数 fopen() 返回的文件指针,c 是要输入的字符
若成功写入,返回字符c
;若写入错误,则返回EOF
。
按字符串读写
按字符串读fgets()
char *fgets(char *s,int n,FILE *fp);
// 从fp所指的文件中读取字符串并在字符串末尾添加'\0',然后存入s,最多读n-1个字符
// 当读到回车换行符、文件末尾或读满n-1个字符时函数返回该字符串的首地址
若出现写入错误,则返回 EOF,否则返回一个非负数
按字符串写fputs()
int fputs(const char *s, FILE *fp);
按格式读写
按格式读fscanf()
int fscanf(FILE *fp, const char *format, ...);
// 比 scanf() 多了文件指针
从fp中读:
fscanf(fp, "%d%f", &i, &t);
按格式写fprintf()
int fprintf(FILE *fp,const char *format,...);
// 比 printf() 多了文件指针
写入fp:
fprintf(fp, "%d,%6.2f", i, t);
按数据块读写
数据块读fread()
从fp所指的文件中读取数据块并存储到buffer指向的内存中
unsigned int fread(void *buffer, unsigned int size, unsigned int count, FILE *fp);
// buffer是数据块起始地址
返回实际读到的数据块个数
数据块写fwrite()
将buffer指向的内存中的数据块写入fp所指的文件
unsigned int fwrite(const void *buffer, unsigned int size, unsigner int count, FILE *fp);
使用举例:
若文件以二进制形式打开:
fread(f,4,2,fp);
此函数从fp所指向的文件中读入2个4个字节的数据,存储到指针f所指向的空间中。
文件随机访问
fseek()
将fp的文件位置指针从fromwhere开始移动offset个字节,指示下一个要读取数据的位置
int fseek(FILE *fp, long offset, int fromwhere);
// ANSI C 要求偏移量offset为长整型数据,常量数据后要加L
// fromwhere有三个取值:0(SEEK_SET)表示文件开始,1(SEEK_CUR)表示当前位置,2(SEEK_END)表示文件末尾
fseek函数应用举例
fseek(fp, 100L, 0);
将位置指针移到离文件头100个字节处。
fseek(fp, 50L, 1);
将位置指针移到离当前位置50个字节处。
fseek(fp, -10L, 2);
将位置指针从文件末尾处向后退10个字节。
rewind()
void rewind(FILE *fp);
将文件位置指针指向文件首字节,即重置到文件首部
ftell()
long ftell(FILE *fp);
按相对文件首部的偏移量来表示当前文件指针位置