文件分为:二进制文件与文本文件(ASCII码文件)
区别:
二进制文件把内存中的数据按其在内存中存放形式原样输出到磁盘上。
文本文件:把文件看作是一个一个的字符序列。ASCII
整数10000:5个字节 '1' '0' '0' '0' '0'
00110001 00110000
二进制文件: 00100111 00010000
即C语言文件:二进制流或者字节流。
所谓缓冲文件系统:系统自动地在内存中为每一个正在使用的文件开辟
一个缓冲区。
非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个
文件设定缓冲区。
一般:文本文件用缓冲文件系统,二进制文件用非缓冲文件系统。
文件类型的指针:
FILE f[5];//文件数组、 f[0]~f[4]:存放5个文件
FLIE *fp;//定义文件类型指针
13。3文件的打开与关闭:
打开文件:fopen函数(文件名,打开方式)
FILE *fp1=fopen("a1.txt","r");
//通用,用相对路径,如果操作简单,用绝对路径
FILE *fp2; "文件路径\\文件名",打开方式
fp2=fopen("d:\\b.out","w");
<1>文本文件: 一个一个地字符
“r“ 只读 为输入打开一个文本文件
“w” 只写:为输出开一个文本文件
“a” 追加: 向文本文件尾增加数据
“r+” 读写:为读/写打开一个文本文件.文件要存在
“w+” 读写: 为读/写建立一个新的文件文件
“a+” 读写:为读/写打开一个文本文件。
#include "stdio.h"
#include "malloc.h"
int main()
{
FILE *pf1=fopen("d:\\1.txt","r+");
FILE *pf2=fopen("e:\\j.out","a");//追加
int a[5]; //"w"截取
for(int i=0;i <5;i++)
{
fscanf(pf1,"%d",&a[i]);
printf("%d ",a[i]);
}
for(int i=0;i <5;i++)
fprintf(pf2,"%d ",a[i]*10);
fclose(pf1);//关闭文件
fclose(pf2);//关闭文件
getchar();
getchar();
return 0;
}
<2>二进制文件
“rb” 只读:为输入打开一个二进制文件
“wb” 只写:为输出打开一个二进制文件
“ab” 追加:向二进制文件尾增加数据
“rb+” 读写 为读/写打开一个二进制文件
“wb+” 读写 为读/写建立一个新的二进制文件
“ab+” 读写 为读写打开一个二进制文件
二进制输出与文本是一样[自动转化],但二进制读放与
文本文本不一样。
"r"--"r+"--
"w"--"w+"--
"a"---"a+"
三、文件关闭:打开使用完后,必须关闭,是指针与该
文件始终相连
。
fclose(文件指针);---0成功关闭 -1(EOF)失败
fopen()---成功,返回的是那个文件的地址。失败返回为NULL(0)
fputc()与fgetc();
fputc(一个字符变量,文件指针);//向文件输出一个字
符回顾:putchar();getchar(); putchar(getchar());
ch=fgetc(fp);//从文件得到一个字符
注意:EOF 文件结束时[容易出错],返回-1;用于文本文件;如果是
二进制文件用:feof函数也可以适合文本文件
!feof(fp1) :feof()当文件结束时返回0。
#include
FILE *fp1;
FILE *fp2;
int main()
{
fp1=fopen("e:\\w1.out","r+");
fp2=fopen("e:\\w1.bas","w+");
char ch;
do
{
ch=fgetc(fp1);//得到一个字符
putchar(ch); //printf("%c",ch);
ch=ch+17;//加密
fputc(ch,fp2);//输出到文件
}
while(!feof(fp1));//ch!=EOF c语言可以的文本文件 ;//文件结事
fclose(fp1);
getchar();//敲任意键:输出字符到文件
return 1;
}
如果要文件名键盘读进来,可以采用:
char filename[20];定义字符串来放文件名;
scanf("%s",filename);//键盘读进来文件
FILE *fp1=fopen(filename,"r");//用键盘读入输入的文字名
//改写成: FILE *fp1=fopen("d:\\1.txt","r");
FILE *fp2=fopen("d:\\2.txt","w+");
char ch;
ch=fgetc(fp1);
while(ch!=EOF)//没有到文件尾
{ //可以修改成 while(!feof(fp1))
if((ch>='a')&&(ch <='z'))
fputc(ch-32,fp2);//不断输出
else if((ch>='A')&&(ch <='Z'))
fputc(ch+32,fp2);
else fputc(ch,fp2);
ch=fgetc(fp1);//循环读入
}
fclose(fp2);//关闭文件
fclose(fp1);//关闭文件
getchar();
getchar();
return 0;
}
exit(0);//退出整个主程序,一般用于非正常结束
四、重要函数:都适用于文本文件。EOF feof() awr
fprintf(文件指针,"格式控制",输出列表);
fscanf(文件指针,"格式化控制",&地址列表);
<1>int a; fscanf(fp,"%d",&a);
int b[5];for() fscanf(fp,"%d\n",&b[i]);
fprintf(fp,"%5d",a);//用来格式控制文件输出
float r; fscanf(fp,"%f",&a);
fprintf(fp,"%5.2f",r);
<3>字符:char ch; scanf("%c",&ch);ch=getchar
(); fscanf(fp,"%c",&ch); ch=fgetc();
fprintf(fp,"%4c",ch);fputc(ch);
<4>字符串:char name[20];
fscanf(fp,"%s",name);
fgets(name,n,fp);//从文件fp中读取长度为n个字符放
在name中fprintf(fp,"%4s",name);fputs("hello",fp);
fputs(name,fp);
//源程序:
FILE *fp1=fopen("e:\\r.txt","r+");
FILE *fp3=fopen("d:\\OK.doc","a+");
char name[20];
fgets(name,5,fp1);
fputs("世杰电脑专修学院",fp3);
fputs(name,fp3);
fclose(fp3);
<5>putw(); 读取整数
getw(); putw(10 ,fp); int i=getw(fp);
五、fread:(buffer,size,count,fp)
必须用于二进制文件,当我们要读入一个实数或者 一个结构体变量的值
是可以用他们来实现:
fwrite:(buffer,size,count,fp);
buffer:是一个指针,&变量地址--数组名直接用
size:要读写的字节数
count:进行读写多少个size字节的数据项
fp:那个文件,是文件指针。
如:struct node
{
int a;
char b;
};
void main()
{
FILE *fp,*fp2;
fp=fopen("d:\\3.txt","rb");
char file[20];//读入要输出文件的文件名
scanf("%s",file);
fp2=fopen(file,"wb");
struct node a[3];
for(int i=0;i <3;i++)
{
fread(&a[i],sizeof(struct node),1,fp);
fwrite(&a[i],sizeof(struct node),1,fp2);
}
fclose(fp);
fclose(fp2);
}
阅读(1553) | 评论(0) | 转发(0) |