1.文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,状态和位置等)。这些信息都保存在一个结构体变量中,并由系统声明,取名FILE。
创建一个文件指针,这个指针就可以指向文件所在的位置并且访问。同时需要用到fopen。
FILE * fopen (const char * filename,const char * mode)
//filename 表示文件名 mode 表示用什么方式打开文件
//fopen 返回一个文件指针
//举例
int main()
{
FILE* pf;
pf = fopen("test.txt", "w");
fclose(pf);
pf = NULL;
return 0;
}
程序结束时必须关闭文件,否则打开文件所开辟的文件信息区会占用内存,内存并非无限的。
2.文件的顺序读写
2.1字符输入/输出函数 fgetc/fputc
int fgetc( FILE *stream ); fgetc表示从文件读取数据到程序
int fputc( int c, FILE *stream ); fputc表示从程序写入数据到文件
举例 首先写入数据
可以看出文件为空。
int main()
{
FILE* pf;
pf = fopen("test.txt", "w");
char a[120] = "zxcxvbnmasdfghjklqe";
for (int i = 0;i < strlen(a);i++)
{
fputc(a[i], pf);
}
fclose(pf);
pf = NULL;
return 0;
}
此时写入成功,再载入到程序中。
2.2文本行输入/输出函数 fgets/fputs
char *fgets( char *string, int n, FILE *stream );
从文件读取一个字符串
int fputs( const char *string, FILE *stream );
写入一个字符串到文件
首先写入一个字符串
然后在从文件读取
int main()
{
FILE* pf;
pf = fopen("test.txt", "r+");
if (pf == NULL)
{
perror("fopen:");
return 1;
}
//char a[120] = "zxcxvbnmasdfghjklqe";
//fputs(a, pf);
char b[50];
char* str ;
str = fgets(b, 50, pf);
printf("%s\n", str);
fclose(pf);
pf = NULL;
return 0;
}
2.3格式化输入/输出函数 fscanf/fprintf
int fscanf( FILE *stream, const char *format [, argument ]... );
从文件读取格式化数据
int fprintf( FILE *stream, const char *format [, argument ]...);
把格式化数据写入文件
还是以之前的程序为例
然后在从文件读取
int main()
{
FILE* pf;
pf = fopen("test.txt", "r+");
if (pf == NULL)
{
perror("fopen:");
return 1;
}
/* char a[120] = "zxcxvbnmasdfghjklqe";
fprintf(pf,"%s",a);*/
char b[50];
fscanf(pf,"%s", b);
printf("%s\n", b);
fclose(pf);
pf = NULL;
return 0;
}
2.4 二进制输入/输出 fread/fwrite (数据都变为二进制形式)
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
从文件读取数据
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
写入数据到文件
int main()
{
FILE* pf;
pf = fopen("test.txt", "r+");
if (pf == NULL)
{
perror("fopen:");
return 1;
}
char a[] = "zxcxvbnmasdfghjklqe";
fwrite(a,sizeof(a), 1,pf); //写入a 大小为sizeof(a) 写一个 到pf
/* char b[50];
fscanf(pf, "%s", b);
printf("%s\n", b);*/
fclose(pf);
pf = NULL;
return 0;
}
然后读取数据
int main()
{
FILE* pf;
pf = fopen("test.txt", "r+");
if (pf == NULL)
{
perror("fopen:");
return 1;
}
/* char a[] = "zxcxvbnmasdfghjklqe";
fwrite(a,sizeof(a), 1,pf); */ //写入a 大小为sizeof(a) 写一个 到pf
char b[50];
fread(b, 50,1, pf);
printf("%s\n", b);
fclose(pf);
pf = NULL;
return 0;
}
3.文件的随机读写
3.1 根据文件指针的位置和偏移量来定位文件指针 fseek
int fseek( FILE *stream, long offset, int origin );
3.2 返回文件指针相对于起始位置的偏移量 ftell
long ftell( FILE *stream );
3.3 让文件指针的位置回到文件的起始位置 rewind
void rewind( FILE *stream );
4.文件读取结束的判定
if (feof(pf))
{
printf("error reading test.bin:unexpected end of file\n");
}
else if (ferror(pf))
{
perror("error reading test.bin");
}
feof仅仅是用来判断文件是因为读取失败结束还是因为遇到文件尾结束,而不是遇到EOF
ferror(pf)才是用来判断读取文件失败的原因的。