c语言能通过文件指针还有文件操作函数进行文件操作,文件操作分为文本操作,还有二进制文件操作。
1 写入文本文件
#include
#include
int main(int argc, char *argv[]) {
FILE *fp;//创建个文件指针
fp=fopen("create.txt","w");//指针指向文件位置,以写入文本;
char a[10];
gets(a);//输入文本
fputs(a,fp);//将数组写入文件;
return 0;
}
2 当同一个主函数内同时写和读会出现错误,当用的r+读的是还未更改的文件,而二进制操作函数不会。
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
FILE *fp,*ap;
fp=fopen("create.txt","r+");//打开可读写文本,当写入信息时从头开始覆盖信息;
char a[20];
gets(a);
fputs(a,fp);
close(fp);
ap=fopen("create.txt","r");//可能因为缓存在内存文件还没关闭,所以读的是硬盘中还没有更改的数据
//也可能是读取方式问题。
char b[20];
fgets(b,21,ap);
puts(b);
close(ap);
return 0;
}
3 当用用只写方式打开文件,之后读就会读不到数据:
#include
#include
int main(int argc, char *argv[]) {
FILE *fp,*ap;
fp=fopen("create.txt","w");//打开可写文本 ,打开的时候清空文件;
char a[20];
gets(a);
fputs(a,fp);
close(fp);
ap=fopen("create.txt","r");//因为清空了文件,所以读的是空的。
char b[20];
fgets(b,21,ap);
puts(b);
close(ap);
return 0;
}
4当用添加方式打开文件,读的时候就会读的是没更改的,可以用同一个指针,和rewind()函数读取
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
FILE *fp,*ap;
fp=fopen("create.txt","a+");//打开可读写文本 ,数据写在末尾;
char a[20];
gets(a);
fputs(a,fp);
close(fp);
ap=fopen("create.txt","r");//因为硬盘内还没有改变所以读的是没有更改的数据
char b[20];
fgets(b,21,ap);
puts(b);
close(ap);
return 0;
}
所以读写文本文件还是不要在一个函数内执行,用单个字符函数操作也一样:getc(pt);
5
利用主函数的参数打开文件:
#include
#include
int main(int argc, char *argv[]) {
FILE *fp;
char c;
if((fp=(fopen(argv[1],"r")))==NULL) {//注意要打括号,不然==运算优先级大于=;
//还有变量不要用""括起来,因为"adf"代表的是第一个字符的地址,
//而argv[1]就是一个地址,括起来应该就是地址的首字符的地址了;
printf("%s\n",argv[1]);//argv[0]村的是调用程序的命令,argv[1]是参数,argc是命令数
printf("open err");
exit(0);
}
while(1) {
c=fgetc(fp);
if(c==EOF)
break;
printf("%c",c);
}
fclose(fp);
return 0;
}
二进制文件操作,和文本文件操作大致相同,在打开文件方式后面加个b就好了,可以在一个main函数内读写,不会读到未更改数据,或许是因为函数机制不同,以后知道了会补;
1.
#include
#include
void main()
{
int iArray[5];
int i;
FILE *fp;
fp=fopen("test.dat","rb+");
if(fp==NULL)
{
printf("cannot open this file\n");
exit(0);
}
printf("please input 5 integers");
for(i=0;i<5;i++)
scanf("%d",&iArray[i]);
fwrite(iArray,(sizeof(int))*5,1,fp);//一个int型4个字节 ,和fgets不同可以同一个main函数内及时读取;
fclose(fp); //读取方式可以逐个读取for(){fread(&iarray[i],2,1,fp);}可以用sizeof获取大小;
FILE *ap;
int aarray[5],b;
ap=fopen("test.dat","rb");
fread(aarray,20,1,ap);
for(b=0;b<5;b++)
{
printf("%d\n",aarray[b]);
}
}
2储存自定义结构体:
#include
#include
void main() {
struct type_student {
char name[10];
int imath;
};
struct type_student stu[5],stud[5];
FILE *fp;
int loop;
fp=fopen("student.dat","w");
puts("输入名字,数学成绩,用空格隔开");
for(loop=0;loop<5;loop++)
scanf("%s %d",stu[loop].name,&stu[loop].imath);
fwrite(stu,sizeof(struct type_student),1,fp);
fclose(fp);
}
3.读取储存的结构体二进制数据:
#include
#include
void main() {
struct type_student {
char name[10];
int imath;
};
struct type_student stud[5];
FILE *fp;
int loop;
fp=fopen("student.dat","r");
fread(stud,(sizeof(struct type_student))*5,1,fp);
printf("%d\n",sizeof(struct type_student));//输出结构体大小,有两个字节是没有储存输入的数据的;
printf("%d\n",sizeof(char[10]));//因为好奇打的
for(loop=0;loop<5;loop++)
printf("%s %d\n",stud[loop].name,stud[loop].imath);
fclose(fp);
}
4.二进制文件随机读取,rewind,freek
#include
#include
int main(int argc, char *argv[]) {
FILE *fp;
int mo[10]={0,1,2,3,4,5,6,7,8,9};
fp=fopen("te.dat","rb+");
fwrite(mo,(sizeof(int)*10),1,fp);
rewind(fp);
fseek(fp,4,0);//将指针指向第4字节;
int a;
fread(&a,4,1,fp);//读取5678字节数据;
printf("%d",a);
return 0;
}
5指针位置和结束判断;ftell(),feof();
#include
#include
int main(int argc, char *argv[]) {
FILE *fp;
int mo[10]={0,1,2,3,4,5,6,7,8,9};
fp=fopen("te.dat","rb+");
fwrite(mo,(sizeof(int)*10),1,fp);
rewind(fp);
fseek(fp,4,0);//将指针指向第4字节; //fseek(指针,距离源位置多远,源位置);
//源位置=0(文件头),1(当前位置),2(文件尾)
long a;
a=ftell(fp);//返回指针位置;
printf("%d",a);
return 0;
}
#include
#include
int main(int argc, char *argv[]) {
FILE *fp;
char mo[10]="niyaonigds";
fp=fopen("te.dat","rb+");
fwrite(mo,(sizeof(char)*10),1,fp);
rewind(fp);
while(!feof(fp)) //feof可以判断文件是否结束,EOF结束判断返回的是-1所以二进制文件用不了,这个函数用在文本文件也行
putchar(fgetc(fp));
}