C/C++文件处理

//:很多注意点写在了代码的注释中
一.文件的基本操作

这一小节包括不同类型的数据存入文件

int main()//写入数字 和字符串 和 结构体 
{
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");//如果想追加写入 可以用'ab',   'wb'会覆盖 
	//也可以写成 D:\\DeV项目\\平时学习\\文件操作.txt
	
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
	//方法一 
	int buf[4]={1,2,3,4} ;
	fwrite(buf,1,sizeof(buf),fp);
	//方法二:格式化为字符串进行写入 
	for (int i=0;i<4;i++)
	{
		char text[16];
		sprintf(text,"%d,",buf[i]);
		fwrite(text,1,strlen(text),fp);
	 } 
	
	//字符串 
	char buf1[16]="hello";
	fwrite(buf1,1,sizeof(buf1),fp);
	
	//结构体 
	struct Student
	{
		int id;
		char gender;
		char name[16];
	 } ;
	 Student stu = {17090417,'M',"howuei"};
	 //fwrite(&stu,1,sizeof(Student),fp);
	 fwrite(&stu.id,1,4,fp);
	 fwrite(&stu.gender,1,1,fp);
	 fwrite(&stu.name,1,16,fp);
	 
	
	fclose(fp);
	return 0;
 } 

二.文件的存储格式
原则是:能存能取

这就需要我们在存储时加上一定的分隔符

#include<stdio.h> 
#include<stdlib.h>
//文件存储的原则:能存能取————这就要求我们在文件存储的时候需要哟一定的分隔符。
int save()
{
  
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
  
    //    int a = 12345;
    //    int b = 6789;
    //    fwrite(&a,1,4,fp);
    //    fwrite(&b,1,4,fp);//class a
    
    //数组的存储 
    int arr[4] = {1,23,3,4};
    
    fwrite(arr,1,16,fp);
    
    fclose(fp);
}

int load()
{
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
	
//    int buf[2];
//    int i=0;
//    while(!feof(fp))
//	{
//	    fread(buf+i,1,4,fp);
//	    i++;
//	}
//	printf("%d,%d",buf[0],buf[1]);//class a

    while(!feof(fp))
	{
	    int a;
		if(fread(&a,1,4,fp) <= 0) 
		{
			break;
		}
		
		printf("%d\n",a);
		
	}
 
    fclose(fp);
}


int main()
{
	//save();
	load();
	return 0;
}

**//尤其要注意的是save 和 load 函数要注释一个才能调用另一个。**


三.文件的数据读取

当文件较大时,可以采用每次读取一定长度的字节来解决。

#include<stdio.h> 
#include<stdlib.h>

int save()
{
  
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
   //存入一段较长的字符串 
	char buf1[130]="hello,world!good,morning,everyone";
	fwrite(buf1,1,sizeof(buf1),fp);
}

int load()
{
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
	
    //当文件很大时,不能一次性读完,可以每次读一定的长度 
	char buf[4];
	while(!feof(fp))
	{
	
		int n = fread(buf,1,4,fp);//buf要存储到的目标地址
		if(n > 0)
		{
			printf("read  %d  bytes\n",n);
		 } 
	}
}


int main()
{
	//save();
	load();
	return 0;
}

四.文件的随机访问
这里调用的是fseek函数

int fseek(FILE *stream,int offset,int mode)
stream:文件指针
offset:整数表示偏移值
mode:相对位置
返回值 : 0 成功 -1 失败

跳到第100个字节的位置
fseek(fp,100,SEEK_SET)

跳到倒数第100个字节的位置
fseek(fp,100,SEEK_END)

跳到当前位置往前第100个字节的位置
fseek(fp,100,SEEK_CUR)

跳到当前位置往后第100个字节的位置
fseek(fp,100,SEEK_CUR)

#include<stdio.h>
#include<stdlib.h> 

 int load()
{
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
	
     unsigned char buf[4];
     
     if(fseek(fp,4,SEEK_SET)==0)
     {
     	fread(buf,1,4,fp);
	 }

    
 
    fclose(fp);
}


int main()
{
	load();
	return 0;
}

**//切记不要频繁 调用  fseek  ,否则伤害硬盘。最好一次性读大量数据** 

五.文件的按行存储

即每次存储加一个 \n 换行符

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>

int save()
{
  
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
  
    char ip[] = "192.108.1.10";
    int port = 8080;
    
    char line[256];
//    sprintf(line,"ip = %s \n ",ip);
//    fwrite(line,1,strlen(line),fp);
//    
//    sprintf(line,"port = %d \n",port);
//    fwrite(line,1,strlen(line),fp);

    //可简化为
	fprintf(fp,"ip = %s\n ",ip);
	fprintf(fp,"port = %d\n",port);
    
    fclose(fp);
}

int load()
{
	FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
	if(fp==NULL)
	{
		printf("Fail to open!\n");
		return -1;
	}
	
    char buf[512];
    while(!feof(fp))
    {
    	char* line = fgets(buf,512,fp);
    	if(line)
    	{
    		printf("got : %s \n",line);
		}
	}

 
    fclose(fp);
}


int main()
{
	//save();
	load();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值