文件操作三步:打开、读写、关闭。
一、文件的打开与关闭
FILE *fp;
fp = fopen("test.txt", "r");
......
fclose(fp);
二、文件操作函数
1、单字符的读写函数
int fputc(int ch, FILE *fp);
int fgetc(FILE *fp);
每次写入和读入一个字符,文件位置指针会自动指向下一个字符。
用feof(fp)判断文件是否真正的结束。
eg:
#include <stdio.h>
main()
{
FILE *fp_in = NULL;
if((fp_in = fopen("test.txt", "r")) == NULL){
printf("open error");
return;
}
FILE *fp_out = NULL;
if((fp_out = fopen("out.txt", "w")) == NULL){
printf("open error");
return;
}
while(!feof(fp_in)){
//printf("fgetc:%c\n",fgetc(fp_in));
fputc(fgetc(fp_in), fp_out);
}
fclose(fp_in);
fclose(fp_out);
}
运行结果:将test.txt的内容复制到了out.txt里面。
2、字符串读写函数
char *fgets(char *str, int n, FILE *fp); 从fp所指向的文件中读取n-1个字符,并将这些字符放到以str为起始地址的单元中。如果在读入n-1个字符之前遇到换行符或者eof,则读入结束。字符串的最后加一个‘\0’字符。成功返回输入串的首地址;遇到文件结束或失败返回NULL
int fputs(char *str, FILE *fp);向fp指向的文件写入以str为首地址的字符串。写入成功返回0,出错返回非0值。
3、格式化读写函数
fprintf(fp, 格式字符串, 输出表列);
fscanf(fp, 格式字符串, 输入表列);
同printf、scanf,只是读写对象是终端;而带f的读写对象是磁盘文件。
4、数据块读写函数(一般用于二进制文件读写)
从文件读写一块数据(eg:一个数组元素,一个结构体变量的数据记录等)使用数据块读写函数非常方便。
int fread(void *buffer, int size, int count, FILE *fp); buffer 用于存放读入数据的首地址。 size是一个数据块的字节数(每块的大小);count是要读写的数据块的块数。
int fwrite(void *buffer, int size, int count, FILE *fp);buffer 用于存放输出数据的首地址。
#include <stdio.h>
#include <string.h>
struct student
{
intnum;
charname[20];
charsex;
intage;
floatscore;
};
main()
{
structstudent stud;
charnumstr[20],ch;
FILE*fp;
if((fp = fopen("student.dat", "wb")) == NULL){
printf("can'topen student.dat\n");
return;
}
stud.num= 1;
strcpy(stud.name,"yuanli");
stud.sex='n';
stud.age=30;
stud.score= 98.88;
printf("sizeof:%d\n",sizeof(structstudent));
printf("num:%d,name:%s,sex:%c,age:%d,score:%f\n",stud.num,stud.name,stud.sex,stud.age,stud.score);
if(fwrite(&stud,sizeof(struct student), 1 ,fp)<1)
printf("writeerror\n");
printf("writesuccess\n");
fclose(fp);
}
5、文件随机读写
对文件可以顺序读写,也可随机读写。可以通过文件位置指针函数,实现文件的定位读写。
(1) 位置指针复位函数。
rewind(FILE *fp); 是将文件重新定位到文件开始的地方
(2) 位置指针的随机移动函数
int fseek(FILE*fp, long offset, int base);
将文件的位置指针移动到以base为起始点,offset为位移量的位置,同时清除文件结束标志。
base:SEEK_SET 、 SEEK_CUR、SEEK_END,分别表示文件开始、当前位置和文件末尾。
参数offset表示以起始点为基准,向前或向后移动的字节数(正、负);
(3) 获取文件位置指针当前位置的函数。
long ftell(FILE *fp);
返回位置指针相对于文件开头的位移量,若出错则返回-1.
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE*fp = NULL;
if((fp= fopen("student.dat", "r")) == NULL){
printf("openerror\n");
return;
}
fseek(fp,0, SEEK_END);
longfilesize = ftell(fp);
printf("filesize:%ld\n",filesize);
}