文件操作基础(c语言)2019-3.16

        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)); 
}

 

你可能感兴趣的:(c语言)