C语言中的文件主要指存放在磁盘上的文件。磁盘文件操作前要打开,处理后要关闭,文件的操作方式主要有,读取文件中的数据到内存中,还有将数据写到文件中,这就是文件的读和写。
类型名FILE称为文件类型,用FILE定义的指针变量通常称为文件型指针,定义格式为:FILE* 文件型指针名。
FILE *pf;
pf=fopen("test.txt","r");
fclose(pf);
打开文件的函数为:fp=fopen(文件名,使用文件的方式),fp为用户定义的文件类型指针,指向内部数据,即要打开的文件。
关闭文件fclose(pf);
文件的使用方式有(文本文件的使用方式)
使用方式 | 含义 |
"r"只读 | 打开一个已存在的文本文件,只能读取数据; |
"w"只写 | 打开一个文本文件,只能写入数据; 如果文件不存在,自动建立一个新文件并接收写入的数据; 如果文件存在,则删除旧文件,建立一个同名新文件并接收写入的数据; |
"a"追加 | 打开一个已存在的文本文件,只能写入数据并且追加在文件尾部; |
"r+"读写 | 打开一个已存在的文本文件,可以读写数据,也可以写入数据; |
"w+"读写 | 打开一个文本文件,可以读写数据,也可以写入数据; 如果文件不存在,自动建立一个新文件并接收写入的数据; 如果文件存在,则删除旧文件,建立一个同名新文件并接收写入的数据; |
"a+"读写 | 打开一个已存在的文本文件,可以读取数据,也可以追加数据到文件尾部 |
字符的读写函数
写字符fputc( ),调用格式为:fputc(ch,fp),将变量ch中的字符写道fp所指向的文件缓冲区的当前位置。
pf=fopen("test.txt","w");
fputc('a',pf);
读字符fgetc( ),调用格式为:fgetc(ch,fp),从fp所指向的文件缓冲区当位置读取一个字符。
pf=fopen("test.txt","w");
fputc('a',pf);
char ch;
ch=fgetc(pf);
printf("%c\n",ch);
字符串读写函数
写字符串函数用fputs( ),调用格式为:fputs( str, fp),将str所指向的一个字符串,舍去结束标志'\0'后写入fp所指向的文件缓冲区。
char str[20];
FILE *pf=NULL;
char str02[]="123456789";
char str03[]="abcefg";
pf=fopen("fputs_buf.txt","a");
if(NULL==pf)
{
printf("fputs_buf.txt不存在\n");
}
else
{
//fputs读取成功后,返回值是0
fputs(str02,pf);
}
读字符串函数
读字符串函数用fgets( ),调用格式为:fgets(str , n ,fp),从fp所指向的文件缓冲区当前位置读取n-1个字符,在其后补充一个字符串结束标志' \0 ',组成字符串并存入str指定的内存区。
总结:单行:1.读够n-1个字符,就会停止 2.如果不够n-1,就的读取实际字符数;多行:遇到换行符,读入换行符后,停止读取后面内容 。
char str[20];
FILE *pf=NULL;
char *p;
pf=fopen("fgets_buf.txt","r");
if(NULL==pf)
{
printf("fgets_buf.txt不存在\n");
}
else
{
p=fgets(str,8,pf);
}
数据读写函数
读/写数据函数处理的文件主要是二进制文件,也可以是文本文件。读写的数据可以是字符型,整型和实型,也可以是结构类型等。
写数据函数fwrite( ),调用格式:fwrite(buffer,unsigned size,unsigned n,fp),将buffer(缓冲区)指向的n个数据(每个数据的字节为size)写入fp指向的文件。
FILE *pf=NULL;
pf=fopen("fwrite.txt","w");//
char str[100];
if(NULL==pf)
{
printf("write.txt文件不存在\n");
}
else
{
char str[]="this is a fwrite test";
fwrite(str,1,4,pf);
//printf("str=%s",str);
}
fclose(pf);
读数据函数fread( ),调用格式:fread(buffer,size,n,fp),将fp所指向的文件缓冲区的当前位置读取n个数据,每个数据的字节数为size,共同组成n个长度为size的数据存入buffer指定的内存区。
FILE *pf=NULL;
pf=fopen("fread.txt","r");//
char str[100];
if(NULL==pf)
{
printf("fread.txt文件不存在\n");
}
else
{
fread(str,1,5,pf);
printf("str=%s",str);
}
fclose(pf);
关于文件的一些其他函数
fscanf函数和fprintf函数
fscanf函数只能从文本文件中按格式输入。fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件的数据。
FILE *pf=NULL;
int a,b;
pf=fopen("test_fscanf.txt","r");
if(NULL==pf)
{
printf("test_fscanf.txt不存在\n");
}
else
{
fscanf(pf,"%d",&a);
printf("a=%d\n",a);
a+=100;
printf("a+100=%d\n",a);
fscanf(pf,"%d",&b);
printf("b=%d\n",b);
b+=100;
printf("b+100=%d\n",b);
}
fclose(pf);
fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中。fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中。
FILE *pf=NULL;
char s01[]="this is the test_fprintf.";
int a[]={1,2,3,4,5,6,7};
pf=fopen("test_fprintf.txt","w");
fprintf(pf,"%s\n",s01);
int i;
for(i=0;i<7;i++)
{
fprintf(pf,"a[%d]=%d\n",i,a[i]);
}
fclose(pf);
sscanf函数和sprintf函数
类似于scanf和printf 但把字符串*buffer用于输入输出。
sscanf函数,sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。如下,把str01的字符串输入到str02中
char str01[]="this is test sprintf buf.";
char str02[100]={0};
sscanf(str01,"%s",str02);
printf("%s\n",str01);
printf("%s\n",str02);
sprintf函数,sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。最大的作用就是可以连接字符串,如下面的练习题。
有两个磁盘文件"A"和"B",各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件"c"中去。
void fun02(FILE *pf01,FILE *pf02)
{
int i,m=0,n=0;
int j=1;
int temp;
int l;
FILE *pf1=NULL;
char a[SIZE];
char b[SIZE];
char str[SIZE];
pf01=fopen("第二个文件.txt","r");
fgets(a,10,pf01);
fclose(pf01);
pf02=fopen("第一个文件.txt","r");
fgets(b,10,pf02);
fclose(pf02);
printf("%s\n",a);
printf("%s\n",b);
sprintf(str,"%s%s",a,b);
printf("%s\n",str);
l=strlen(str);
m=l;
for(i=0;i<l;i++)
{
for(n=m;n>1;n--)
{
if(str[i]>str[j])
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
j++;
}
j=i+2;
m--;
}
printf("%s",str);
pf1=fopen("第三个文件.txt","w");
fputs(str,pf1);
fclose(pf1);
}
int main()
{
FILE *pf1=NULL;
pf1=fopen("第二个文件.txt","w");
fputs("sjyqbcnma",pf1);
fclose(pf1);
FILE *pf2=NULL;
pf2=fopen("第一个文件.txt","w");
fputs("iutwopj",pf2);
fclose(pf2);
fun02(pf1,pf2);
return 0;
}
fseek函数 :目的是对“指向当前流读写位置的指针”进行偏移设置。(这个函数刚接触,用的很少,以后会继续更新)
int fseek( FILE *stream, long offset, int origin );
参数1:文件指针
参数2:偏移量
参数3:参考点
SEEK_SET 0 文件开头
SEEK_END 2 文件末尾
SEEK_CUR 1 文件当前位置
FILE *pf=NULL;
char str01[100]={0};
pf=fopen("ts_fseek.txt","r");
fgets(str01,19,pf);
printf("%s\n",str01);
fseek(pf,5,SEEK_SET);//距离文件开头
fgets(str01,19,pf);
printf("%s\n",str01);
fseek(pf,-5,SEEK_END);
fgets(str01,19,pf);
printf("%s\n",str01);
ftell()函数
函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。ftell 使用场景 : 随机方式存取文件时 , 使用 fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell函数确定指针位置 ;
FILE *pf=NULL;
char str01[]="this is test rewind.";
char str02[100];
pf=fopen("ts_rewind.txt","w+");
fputs(str01,pf);
printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf));
rewind(pf);//重置光标 ,将光标位置移动到开始位置
printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf));
fgets(str02,20,pf);
printf("ftell()返回光标距离开始的位置:%d\n",ftell(pf));
printf("str02=%s\n",str02);
fclose(pf);
重置光标前用ftell查看一下,重置后,再看一下 。
这段代码也使用到了rewind函数,rewind函数的功能:重置光标 ,将光标位置移动到开始位置 (将文件内部的位置指针重新指向一个流(数据流/文件)的开头)。
关于文件还有一些函数,如ferror,feof,待我搞明白了会继续更新。