概述
目录
前言
一、文件指针
1.文件打开和关闭
2.打开方式
3.实现代码模板
二、文件顺序读写
1.fputc(从文件里面读一个字符)
2. 三种流
3.fgetc(把一个字符写到文件中)
4.fputs (整行输出)
4.fgets (整行输入)
5..拷贝文件
6. fwrite(将一块内存区域中的数据写入到本地文本)二进制
7.fread(从一个文件流中读取数据)二进制
8.对比以下函数
三、文件随机读写
1.fseek
2.ftell
3 rewind
四、文本文件和二进制文件
五、文件读取结束判定
六、文件缓冲区
总结
前言
为什么使用文件什么是文件
文件的打开和关闭文件的顺序读写文件的随机读写
文本文件和二进制文件文件读取结束的判定文件缓冲区
一、文件指针
1.文件打开和关闭
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
2.打开方式
3.实现代码模板
/* fopen fclose example */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE *pf= fopen ("myfile.txt","w");
//文件操作
if (pf==NULL)
{
//文件打开失败
printf("%sn",strerror(errno));
return 0;
}
//写文件
//关闭文件
fclose(pf);
pf= NULL;
}
二、文件顺序读写
1.fputc(从文件里面读一个字符)
char fputc( char c, FILE *stream );
c:读取的字符
stream:对应的只指针
/* fopen fclose example */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE *pf= fopen ("myfile.txt","w");
//文件操作
if (pf==NULL)
{
//文件打开失败
printf("%sn",strerror(errno));
return 0;
}
//写文件
//fput('a',pf);
//fput('b',pf);
//fput('c',pf);
char ch = 0;
for(ch = 'a'; ch <= 'z'; ch++){
fputc(ch, pf);
}
//关闭文件
fclose(pf);
pf= NULL;
}
结果:
2. 三种流
标准输入流:stdin
标准输出流:stdout
标准错误流 :stderr
从键盘上输入内存时,就是将数据输入到标准输入流
从内存上输入显示器上时,就是将数据输入到标准输出流
使用:将指针替换为所需要的三种流即可。
3.fgetc(把一个字符写到文件中)
int fgetc( FILE*stream );
stream:对应的只指针
/* fopen fclose example */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* pf = fopen("myfile.txt", "w");
//文件操作
if (pf == NULL)
{
//文件打开失败
printf("%sn", strerror(errno));
return 0;
}
//读文件
int ch = fgetc(pf);
printf("%cn",ch);
int ch = fgetc(pf);
printf("%cn", ch);
int ch = fgetc(pf);
printf("%cn", ch);
int ch = fgetc(pf);
printf("%cn", ch);
//关闭文件
fclose(pf);
pf = NULL;
}
4.fputs (整行输出)
int fputs(const char *s, FILE *stream);
把参数s指向的字符串写入stream指向的流,但不包括字符串末尾的空字符
/* fopen fclose example */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* pf = fopen("myfile.txt", "w");
//文件操作
if (pf == NULL)
{
//文件打开失败
printf("%sn", strerror(errno));
return 0;
}
//读文件
fputs("hello world",pf);
//关闭文件
fclose(pf);
pf = NULL;
}
4.fgets (整行输入)
char * fgets(char * s, int n,FILE *stream);
从stream指向的输入流中读取 unsigned char 型的字符串
/* fopen fclose example */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* pf = fopen("myfile.txt", "w");
//文件操作
if (pf == NULL)
{
//文件打开失败
printf("%sn", strerror(errno));
return 0;
}
char buf[1000] = { 0 };
//读文件
fgets(buf, 1000, pf);
printf("%s", buf);
//关闭文件
fclose(pf);
pf = NULL;
}
5..拷贝文件
#include<stdio.h>
#include<errno.h>
int main()//拷贝文件
{
FILE* pr = fopen("text.txt", "r");
if (pr == NULL)
{
printf("open for read:%sn", strerror(errno));
return 0;
}
FILE* pw = fopen("text2.txt","w");
if (pr == NULL)
{
printf("open for write:%sn", strerror(errno));
close(pr);
pr = NULL;
return 0;
}
int ch=0;
//拷贝文件
while ((ch=fgetc(pr)) != EOF)
{
fputc(ch, pw);
}
//关闭文件
fclose(pr);
pr == NULL;
fclose(pw);
pw == NULL;
return 0;
}
6. fwrite(将一块内存区域中的数据写入到本地文本)二进制
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
-- buffer:指向数据块的指针
-- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
-- count:数据个数
-- stream:文件指针
int main()
{
struct stu s[2] - { {"张三",20,95.5}, { "lisi",16,66.5 } };
FILE* pf = fopen("myfile.txt", "wb");
//文件操作
if (pf == NULL)
{
//文件打开失败
printf("%sn", strerror(errno));
return 0;
}
//二进制打开
fwrite(&s, sizeof(struct stu), 2, pf);
//关闭文件
fclose(pf);
pf = NULL;
}
7.fread(从一个文件流中读取数据)二进制
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
-- buffer:指向数据块的指针
-- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
-- count:数据个数
-- stream:文件指针
int main()
{
struct stu s[2] = { 0 };
FILE* pf = fopen("myfile.txt", "rb");
//文件操作
if (pf == NULL)
{
//文件打开失败
printf("%sn", strerror(errno));
return 0;
}
//二进制读文件
fread(s, sizeof(struct stu), 2, pf);
printf("%s %d %lfn",s[0].name, s[0].age, s[0].d);
printf("%s %d %lfn",s[1].name, s[1].age, s[1].d);
//关闭文件
fclose(pf);
pf = NULL;
}
8.对比以下函数
scanf从标准输入流(stdin)上进行格式化输入的函数
printf向标出输出流( stdout)上进行格式化的输出函数
fscanf可以从标准输入流(stdin)/指定的文件流上读取格式化的数据
fprintf把数据按照格式化的方式输出到标准输出流(stdout)/指定的文件流
fscanf()函数(有点像正则表达式):
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
用 法:int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(文件指针,格式字符串,输入列表);
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,数值等于[argument...]的个数
fprintf(pf, "%s %d %s", s.name, s.age, s.sex);//把数据写入文件
sscanf可以从一个字符串中提取(转化)出格式化数据
sprintf把一个格式化的数据转换成字符串
int sscanf( const char *buffer, const char *format [, argument ] ... );
int sprintf( char *buffer, const char *format [, argument] ... );
三、文件随机读写
1.fseek
根据文件指针的位置和偏移量来定位文件指针.
int fseek ( FILE * stream, long int offset, int origin );
描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
注意:
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.简言之:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
ffseek(fp,-100L,2);把fp指针退回到离文件结尾100字节处。
/* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.n",size);
}
return 0;
}
2.ftell
long ftell(FILE *fp);
返回文件指针相对于起始位置的偏移量
/* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.n",size);
}
return 0;
}
3 rewind
void rewind ( FILE * stream );
让文件指针的位置回到文件的起始位置
/* rewind example */
#include <stdio.h>
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='