C基础_文件

文件打开与关闭

int main121()
{
	//文件操作
	//注意:文件类型指针不需要用户操作
	FILE* fp = fopen("E:\\编程学习\\练习\\1.txt", "r");//“r”是读,“w"是写

	//判断文件能否打开
	if (fp == NULL)
	{
		printf("失败\n");//1.找不到文件 2.没有权限 3.程序打开文件超出上限
		return -1;
	}
	printf("成功\n"); 

	fputc("A", fp);//将一个字符写入('w')文件中(会覆盖原来的内容)

	//顺序读取文件中的一个字符
	char ch = fgetc(fp);
	printf("%c\n", ch);
	ch = fgetc(fp);
	printf("%c\n", ch);

	//读整个文件  读取文件结尾 结束标志 EOF -1
	//char ch;
	while ((ch=fgetc(fp))!=EOF)
	{
		printf("%c\n",ch);
	}

	//文件关闭
	fclose(fp);
}

int main122()
{
	//1.以写的形式打开文件
	/*
	  ‘r’ 以只读形式打开文件 不会创建新文件 ,如果文件不存在会报错
	  ‘w’ 以写的方式打开文件 文件不存在会创建新文件 如果文件里面有内容会覆盖原始内容
	  ‘a’ 以追加的方式打开文件 文件不存在回创建新文件 在文件末尾追加内容
		FILE* fp = fopen("../../b.txt", "a");
	*/
	FILE* fp = fopen("../../a.txt", "w");
	//2.判断文件的可用性
	if (fp == NULL)
	{
		return -1;
	}
	//3.写文件||读文件
	char ch = 'a';
	fputc(ch, fp);
	//ch = 'b';
	//fputc(ch, fp);
	//4.关闭文件
	fclose(fp);
	return 0;
}

VI编辑器

/*
1.指定一个文件名 char \ scanf
2.打开文件 FILE * fp = fopen
3.判断文件可用性 if(!fp)
4.循环录入文件内容 char \ while
5.退出命令 if(!strncmp(“comm=exit \ quit”,buf,9)){break;}
6.将字符串写入文件 int i=0; \ while(buf[i]){fputc(buf[i++],fp);}
//更新缓冲区:fflush(fp);
7.关闭文件 //fclose(fp);
*/

int main13()
{
	char fileName[256];//创建文件名
	printf("请您输入一个需要创建的文件:\n");
	scanf("%s", fileName);
	getchar();//接收换行
	FILE* fp = fopen(fileName, "w");//以写的方式打开,会覆盖之前内容
	if (fp == NULL)//判断是否找到地址或文件
	{
		return -1;
	}
	//scanf("%[^\n]",buf);
	//fgets()

	char buf[1024];//接收字符串
	while (1)//可以输入多行内容
	{
		memset(buf, 0, 1024);//令其全为零
		//scanf("%[^\n]", buf);//只能输一行内容
		fgets(buf, 1024, stdin);
		if (strncmp("comm=exit", buf,9) == 0)//comm==exit代表结束
		{
			break;
		}
		int i = 0;
		while (buf[i] != '\0')//读字符串,\0代表接收结束
		{
			fputc(buf[i++], fp);
			//i++;
		}
	}


	fclose(fp);
}

查看文本文件 cat

int main14()
{
	char filename[256];
	printf("请输入查看的文件:\n");
	scanf("%s", filename);
	getchar();

	FILE* fp = fopen(filename, "r");
	if (!fp)
		return -1;//文件结束标志 EOF -1
	char ch;
	while ((ch = fgetc(fp)) != EOF)
		printf("%c",ch);
}

四则运算

/*
1.以写的方式打开文件 判断文件
2.定义三个变量 字符串
3.循环100次
4.格式化字符串
5.录入内容
6.文件关闭
循环四则运算100次
char arr[20]
sprintf(arr,"%d%c%d=\n",a,b,c);
while(arr!=’\0’)
{}
3*2=
5/2=
3-1=
4+6=
*/

//枚举法
enum Mun
{
	add, sub, mlt, dive
}opt;
int main152()
{
	srand((unsigned int)time(NULL));
	//写入
	FILE* fp1 = fopen("E:/编程学习/练习/1.txt", "w");
	if (!fp1)
		return -1;

	int a, b;
	char c;
	char buf[20];

	for (int i = 0; i < 100; i++)
	{
		switch (rand() % 4)
		{
		case add:
			c = '+';
			break;
		case sub:
			c = '-';
			break;
		case mlt:
			c = '*';
			break;
		case dive:
			c = '/';
			break;
		}
		
		a = rand() % 10 + 1;
		b = rand() % 10 + 1;
		memset(buf, 0, 20);
		sprintf(buf, "%d%c%d=\n", a, c, b);//例 2*3=\n
		int j = 0;
		while (buf[j] != '\0')
		{
			fputc(buf[j++], fp1);

		}
	}
	printf("循环完毕\n");
	fclose(fp1);

	system("pause");
	return EXIT_SUCCESS;
}

文件加密解密

//只能适用于中文 文本文件的加密解密
//从源文件中读取字符 进行加密 生成一个新文件
//从加密文件中读取字符 进行解密 变成源文件

//加密
int main161()
{
	FILE* fp1 = fopen("../../src.txt", "r");//源文件
	FILE* fp2 = fopen("../../aps.txt", "w");//加密文件
	if (!fp1 || !fp2)
		return -1;

	//读取文件内容  直到EOF
	char ch;
	while ((ch = fgetc(fp1)) != EOF)
	{
		ch++;
		fputc(ch, fp2);
	}

	fclose(fp1);
	fclose(fp2);
}

//解密
int main162()
{
	FILE* fp1 = fopen("../../aps.txt", "r");//
	FILE* fp2 = fopen("../../src1.txt", "w");//
	if (!fp1 || !fp2)
		return -1;

	//读取文件内容  直到EOF
	char ch;
	while ((ch = fgetc(fp1)) != EOF)
	{
		ch--;
		fputc(ch, fp2);
	}

	fclose(fp1);
	fclose(fp2);
}

文件行读取

//按行读取
int main172()
{
	FILE* fp = fopen("../../d.txt", "r");
	if (!fp)
		return -1;

	//读取第一行  
	char buf[1024];//1kb
	fgets(buf, 1024, fp);//每次读一行
	printf("%s", buf);

	//读取第二行内容
	memset(buf, 0, 1024);
	fgets(buf, 1024, fp);
	printf("%s", buf);

	fclose(fp);
}
//整个文件内容读取
int main173()
{
	FILE* fp = fopen("../../d.txt", "r");
	if (!fp)
		return -1;

	//char buf[1024*1024];//1M
	char* buf = malloc(sizeof(char) * 1024);

	//feof判断文件流是否到结尾  EOF:判断字符是否到结尾
	while (feof(fp))
	{
		memset(buf, 0, 1024);//防止前一次字符污染后面字符
		fgets(buf, 1024, fp);
		printf("%s", buf);
	}

	free(buf);
	fclose(fp);
}

四则运算

/*
1.打开两个文件 c.txt e.txt
2.判断可用性
3.循环读取
4.格式化字符串 sscanf() 计算结果
5.放到e.txt文件中
6.文件关闭
*/

int main181()
{
	FILE* fp1 = fopen("../../c.txt", "r");
	FILE* fp2 = fopen("../../e.txt", "w");
	
	if (!fp1 || !fp2)
		return -1;

	//循环100次
	int a, b;
	int value = 0;
	char c;
	char buf[20];
	for (int i = 0; i < 100; i++)
	{
		memset(buf, 0, 20);
		fgets(buf, 20, fp1);//2+3=\n
		sscanf(buf, "%d%c%d=\n", &a, &c, &b);
		switch (c)
		{
		case'+':
			value = a + b;
			break;
		case'-':
			value = a - b;
			break;
		case'*':
			value = a * b;
			break;
		case'/':
			value = a / b;
			break;
		}
		memset(buf, 0, 20);
		sprintf(buf, "%d%c%d=%d\n", a, c, b, value);
		fputs(buf, fp2);
	}

	fclose(fp1);
	fclose(fp2);
}

格式化读写内容

/*
字符串的标准输入输出
scanf("%d,%d,%d",ch) printf("%0d",1);
格式化字符串 char arr[]=“相约98” char ch[10]=“恋曲”; int a=1990;
sscanf() sprintf() 数据类型 char * format
sscanf(arr,"%s%d",ch,&a);
sprintf(arr,"%s%d",ch,a);
/
格式化文件读写 数据类型 FILE * fp format
fscanf() fprintf()
fscanf(fp,"%s%d",ch,&a);
fprintf(fp,"%s%d",ch,a);
*/

//写文件
int main191()
{
	FILE* fp1 = fopen("../../f.txt", "w");
	if (!fp1)
		return -1;

	sprintf(fp1, "%d+%d=%d\n", 1, 2, 3);

	fclose(fp1);

	system("pause");
	return EXIT_SUCCESS;

}

//读文件
int main192()
{
	FILE* fp1 = fopen("../../f.txt", "r");
	if (!fp1)
		return -1;
	int a, b, c;
	fscanf(fp1, "%d+%d=%d\n", &a, &b, &c);

	printf("%d %d %d\n", a, b, c);

	fclose(fp1);
	return 0;

}

int main193()
{
	FILE* fp1 = fopen("../../c.txt", "r");
	if (!fp1)
		return -1;

	int a, b, c;
	char ch;
	for (int i = 0; i < 100; i++)
	{
		fscanf(fp1,"%d%c%d=\n", &a, &ch, &b);
		printf("%d%c%d\n", a, ch, b);
	}
	fclose(fp1);
	return 0;

}

四则运算

/*
1.打开文件 判断可用性
2.读取内容 放在堆空间中
3.再次打开文件 读取堆空间内容 写入文件中 关闭文件
*/

int main201()
{
	FILE* fp = fopen("../../c.txt", "r+");
	if (!fp)
		return -1;

	char** buf = (char**)malloc(sizeof(char*) * 100);

	//循环100次
	int a, b;
	float value;
	char c;
	for (int i = 0; i < 100; i++)
	{
		buf[i] = (char*)malloc(sizeof(char) * 20);
		//格式化读取
		fscanf(fp, "%d%c%d=\n", &a, &c, &b);

		
		switch (c)
		{
		case'+':
			value = a + b;
			break;
		case'-':
			value = a - b;
			break;
		case'*':
			value = a * b;
			break;
		case'/':
			value = a * 1.0 / b;
			break;
		}
		
		sprintf(buf[i], "%d%c%d=%.2f\n", a, c, b, value);
		
	}

	fclose(fp);

	//for (int i = 0; i < 100; i++)
	//{
	//	printf("%s", buf[i]);
	//}

	//将结果重新写入c.txt
	fp = fopen("../../c.txt", "r+");
	if (!fp)
		return -1;

	for (int i = 0; i < 100; i++)
		fputs(buf[i], fp);
	fclose(fp);

	//内存释放
	for (int i = 0; i < 100; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}
	free(buf);
}

数据排序

//随机10000数据 1-10000 写入到文件中
//读取出来 进行从大到小排序 再写入到文件中

//写入数据
int main()
{
	srand((unsigned int)time(NULL));
	FILE* fp = fopen("D:/Work/g.txt", "w");
	if (!fp)
		return -1;

	for (int i = 0; i < 10000; i++)
	{
		fprintf(fp, "%d\n", rand() % 1000 + 1);
	}
	fclose(fp);

	system("pause");
	return EXIT_SUCCESS;

}
//读数据并排序,再写入
int main()
{
	unsigned int start_time = time(NULL);

	FILE* fp = fopen("D:/Work/g.txt", "r");
	if (!fp)
		return -1;

	int* p = (int *)malloc(sizeof(int) * 10000);

	for (int i = 0; i < 10000; i++)
	{
		fscanf(fp, "%d\n", &p[i]);
	}

	for (int i = 0; i < 10000 - 1; i++)
	{
		for (int j = 0; j < 10000 - i - 1; j++)
		{
			if (p[j] > p[j + 1])
			{
				int temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}

	}
	fclose(fp);

	fp = fopen("D:/Work/g.txt", "w");
	if (!fp)
		return -1;
	for (int i = 0; i < 10000; i++)
	{
		fprintf(fp, "%d\n", p[i]);
	}
	fclose(fp);
	free(p);

	unsigned int end_time = time(NULL);
	printf("用时:%d(s)\n", end_time - start_time);
	return 0;
}

方法二 : 用数组顺序读取1-10000的个数 并写出

int main()
{
	unsigned int start_time = time(NULL);

	FILE* fp = fopen("../../g.txt", "r");
	if (!fp)
		return -1;
	int arr[1000] = { 0 };
	int value;
	//int sum = 0;
	for (int i = 0; i < 100000; i++)
	{
		fscanf(fp, "%d\n", &value);
		arr[value - 1]++;
	}
	fclose(fp);

	fp = fopen("../../g.txt", "w");
	if (!fp)
		return -1;
	for (int i = 0; i < 1000; i++)
		for (int j = 0; j < arr[i]; j++)
			fprintf(fp, "%d\n", i + 1);
	fclose(fp);
	unsigned int end_time = time(NULL);
	printf("用时时间:%d(s)\n", end_time - start_time);

}

块读写

int main1()
{
	char arr[16] = "hello world";

	FILE* fp = fopen("../../a.txt", "wb");
	if (!fp)
		return -1;

	fwrite(arr, sizeof(char), 16, fp);

	fclose(fp);
}

int main2()
{
	FILE* fp = fopen("../../b.txt", "rb");
	if (!fp)
		return -1;

	int arr[10] = { 0 };
	fread(arr, 1, 16, fp);

	fclose(fp);

	printf("%d\n", arr[0]);
	printf("%d\n", arr[1]);
	printf("%d\n", arr[2]);
	printf("%d\n", arr[3]);
	return -1;

}

结构体写入二进制文件

struct students
{
	char name[20];
	int age;
	char sex;
	char tel[15];
};
typedef struct students stu;

int main1()
{
	stu s[5] = {
		{"libai",50,'M',"110"},
		{"li",20,'M',"120"},
		{"lib",30,'M',"119"},
		{"liai",40,'M',"666"},
	};

	FILE* fp = fopen("../../c.txt", "wb");
	if (!fp)
		return -1;

	for (int i = 0; i < 4; i++)
	{
		fwrite(&s[i], sizeof(stu), 1, fp);
	}

	fclose(fp);
}

int main2()
{
	FILE* fp = fopen("../../c.txt", "rb");
	if (!fp)
		return -1;

	stu s[5];
	int i;
	while (!feof(fp))
	{
		fread(&s[i++], 20, 2, fp);
		//fread(&s[i++], sizeof(stu), 1, fp);
	}
	fclose(fp);
	for (i = 0; i < 4; i++)
	{
		printf("姓名:%s\t年龄:%d\t性别:%s\t电话:%s\n", s[i].name, s[i].age, s[i].sex == 'M' ? "男" : "女", s[i].tel);
	}
	return 0;
}

文件随机读写

struct students
{
	char name[10];
	int num;
	int age;
	char addr[15];
}stu[10];

int main()
{
	FILE* fp = fopen("../../stu.txt", "rb");
	if (!fp)
		return -1;

	for (int i = 0; i < 10; i+=2)
	{
		fseek(fp, i*sizeof(struct students), 0);//移动文件位置标记
		fread(&stu[i], sizeof(struct students), 1, fp);
		printf("%-10s %4d %4d %-15s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);
	}
	fclose(fp);
	return 0;
}

出错检测

ferror(fp)

返回值为0,表示未出错;返回非0值,表示出错。
对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值
在执行fopen函数时,ferror函数的初始值自动设为0。

clearerr函数

将文件错误标志和文件结束标志置为0,以便下一次检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值