fopen(参数1,参数2),第一个参数是要打开的文件名,文件名字符串,第二个参数用于制定文件打开模式的一个字符串。
注:如果要打开某个盘的文本如F盘test文件夹下的test.txt文本,则fopen(“F:\test\test.txt”,”r”);
程序成功打开一个文件,fopen返回一个文件指针,FILE *fp=fopen(参数1,参数2) ,打开失败返回空,程序将退出
fclose(fp)关闭指针fp指定的文件,成功关闭返回0,否则返回EOF,结尾加上判定
if(fclose(fp)!=0)
printf("关闭失败");
“r”:打开文本文件,读取
“w”:打开文本文件,写入,先将文件长度截取0,文件要不存在会先自动创建
“a”:打开文本文件,写入,向已有的文件尾部追加内容,文件要是不存在会先自动创建
“r+”:打开文本文件,可读可写
“w+”:打开文本文件,可读可写,先将文件长度截取0,文件要不存在会先自动创建
“a+”:打开文本文件,可读可写,向已有文件尾部追加内容,如果文件不存在先创建
“rb”,”wb”,”ab”,”ab+”,”a+b”,”wb+””w+b”,”ab+”,”a+b”以二进制模式而非文本模式打开文件
一个以二进制读写文本形式写的程序
案例:
#include<stdio.h>
void main()
{
FILE *f_picture,*f_rar,*f_swift;
char pictureName[30],rarName[30],swift[60];
printf("请输入文件名:(如:F:\\picture\\1.jpg) ");
scanf("%s",pictureName);
printf("请输入另一个文件名:(如:F:\\2.RAR) ");
scanf("%s",rarName);
printf("请输入您要合成的文件名:(如:F:\\3.jpg)");
scanf("%s",swift);
//判断图片和压缩文档以及swift转换器以二进制方式是否读写成功
if(!(f_picture = fopen(pictureName,"rb")))
{
printf("Can not read %s successfully!\n",pictureName);
return;
}
if(!(f_rar = fopen(rarName,"rb")))
{
printf("Can not read %s successfully!\n",rarName);
return;
}
if(!(f_swift = fopen(swift,"wb")))
{
printf("Can not read %s successfully!\n",swift);
return;
}
//二进制读写只能以feof函数判断是否在文本结尾结束,非二进制文本读写可以用字符接收的值与EOF比较判断
while(!(feof(f_picture))) //如果读到文件结尾返回非0,否则返回0
{
char ch;
ch = fgetc(f_picture);
fputc(ch, f_swift);
}
fclose(f_picture);
while(!(feof(f_rar)))
{
char ch;
ch = fgetc(f_rar);
fputc(ch,f_swift);
}
fclose(f_rar);
fclose(f_swift);
}
fseek(指向被搜索文件的FILE指针,偏移量(long类型值),模式),一切正常函数返回0,否则返回-1
SEEK_SET 文件开始
SEEK_CUR 当前位置
SEEK_END 文件结尾
fseek(fp,0L,SEEK_SET); //找到文件开始处
fseek(fp,10L,SEEK_SET); //找到文件的第10个字节
fseek(fp,2L,SEEK_CUR); //文件当前位置向前移动两个字节
fseek(fp,0L,SEEK_END); //到达文件结尾处
fseek(fp,-10L,SEEK_SET); //从文件结尾处退回10个字节
ftell()函数为long类型 long len=ftell(fp); //把从文件开始到文件指针处的字节数赋给len
字符输入输出函数fgetc和fputc
fputc(ch,fp); //ch为定义的一个字符,fp为把ch这个字符写入到fp所指向的文件中去,若写入操作成功函数返回写入字符的ascii码,否则返回EOF
案例:
#include<stdio.h>
void main()
{
char ch,ch2;
FILE *fp = fopen("test.txt","w+");
if(!fp)
printf("打开失败!\n");
else
printf("打开成功\n");
ch = getchar();
while(ch!='\n')
{
putc(ch,fp);
ch = getchar();
}
fclose(fp);
}
char ch = fgetc(fp); 从打开的文件fp中读取一个字符并赋给ch
注:读取的文件必须是以读或读写的方式打开的。
案例:
#include<stdio.h>
void main()
{
char ch;
FILE *fp = fopen("test.txt","r+");
if(!fp)
printf("打开失败!\n");
else
printf("打开成功\n");
ch = fgetc(fp);
while(ch!=EOF) //读到为本最后为返回EOF
{
putchar(ch);
ch = fgetc(fp); //fgetc函数每次读取一个字符指针会自动指向下一个字符地址
}
fclose(fp);
}
注:EOF不是可输出字符,因此不能再屏幕上显示,当读入的字符为-1时,表示读入的已不是正常的字符而是文件结束符。
字符串输入输出函数fputs和fgets
fgets(str,n,fp); //从fp指向的文件中读取n-1个字符送入字符数组str,因为最后要加’\0’,fp必须是读或者读写的方式打开文件指针,正常读取函数返回str首地址,读取失败返回null
案例:
#include<stdio.h>
void main()
{
char buffer[20];
FILE *fp;
if(!(fp=fopen("F:\test.txt","r"))) //F盘下的一个test.txt文本
{
printf("读取失败!\n");
return;
}
fgets(buffer,20,fp);
printf("%s\n",buffer);
fclose(fp);
}
fputs(str,fp); //把str中的字符串写入到fp指向的文件中,直到遇到末尾的空字符。fp必须是以写,读写的方式写入,写入成功返回非负值,否则返回EOF。注:fputs(“\r\n”,fp); //用来在文本中换行
案例:
#include<stdio.h>
void main()
{
FILE *fp;
char buffer[20];
char ch;
gets(buffer);
if(!(fp=fopen("F:\test.txt","w+")))
{
printf("写入失败!\n");
return;
}
fputs(buffer,fp);
rewind(fp); //重新定义文件内部指针到文件的开头,方便在后面获取文件每个字符时从头开始获取
ch = fgetc(fp);
while(ch != EOF) //读到文本最后返回EOF
{
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
}
feof函数用来判断是否到达文本结尾,如果没有到结尾返回0否则返回非0(二进制读写文本专用)
ch = getchar() //从标准输入中获得一个字符
ch = getc(fp); //从fp指定的文件中获得一个字符,读到文件结尾返回EOF
Putchar(ch); //从标准输出中输出一个字符
putc(ch, stdout); //从标准输出中输出一个字符
Putc(ch, fp); //把字符写入fp指向的文件
注意:在fopen里写路径需要\,如果通过scanf键盘输入路径只要\
fp = fopen(); //fopen返回指向文件的指针,返回失败返回NULL
fclose() //关闭成功返回0,否则返回EOF
fscanf(fp, “%s %d”, name, i); //从fp指向的文件读取%s %d给name和i
fscanf(stdin, “%s %d”, name, i); //从标准输入中输入name和i
fprintf(fp, “%s %d”, name, i); //%s %d这个字符串写入fp指向的文件
fprintf(stdout, “%s %d”, name, i); //从标准输出中输出字符串%s %d
二进制读写函数fread和fwrite
char buffer[256]; double earnings[10];
fwrite(buffer,256,1,fp); //将数组中的数据写入文件,数据分成1块,每块256字节大小
fwrite(earnings,sizeof(double),10,fp); //将数组中的数据写入文件,数据分成10块,每块都是double大小。(先将数组首地址的double类型大小数据写入fp,指针自动后移将earnings下一个地址double类型大小数据写入fp,…)
fwrite函数返回成功写入的项目数,正常情况与第三个参数相等,如果写入错误返回值会小于第三个参数
double earnings[10];
fread(earnings,sizeof(double),10,fp); //从fp指向的文件读取数据到earnings数组中,读取10块,每块是一个double类型的大小。(第一个double类型大小的数据读入earnings首地址,第二个double大小数据会自动读入earnings下一个地址,…)
fread函数返回成功读取得项目数,正常情况与第三个参数相等,如果读取错误返回值会小于第三个参数
fprintf(fp,”%d”,35); //把35一字符串的形式写入fp
fscanf(fp,”%s”,arr); //从fp内容以字符串的形式读入arr字符数组
rewind(fp)把文本指针置于文件开始处,为读取做好准备,很重要的一个函数