Day12.文件(上)
一、文件打开关闭
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main101(void)
{
//以读的形式打开文件
FILE* fp = fopen("C:\\Users\\徐杰\\Desktop\\01.txt", "w");
if (!fp)
{
//1、找不到文件 2、没有权限 3、程序打开文件超出上限
printf("文件打开失败!!\n");
return -1;
}
//文件操作
printf("文件打开成功\n");
char ch;
while ((ch = fgetc(fp)) != EOF)
{
printf("%c\n", ch);
}
//文件关闭
fclose(fp);
return 0;
}
int main102(void)
{
/*
r 以只读形式打开文件 不会创建新文件,如果文件不存在会报错
w 以写的形式打开文件 文件不存在会创建新文件,文件存在会清空文件内容
a 以追加方式打开文件 文件不存在会创建新文件,文件存在在文件末尾追加内容
*/
//1、以写的形式打开文件
FILE* fp = fopen("C:\\Users\\徐杰\\Desktop\\a.txt", "w");
//2、判断文件可用性
if (!fp)
{
return -1;
}
//3、写入字符
char ch = 'a';
fputc(ch, fp);
ch = 'b';
fputc(ch, fp);
//4、关闭文件
fclose(fp);
return 0;
}
二、VI编辑器
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
char filename[256];
printf("请宁输入一个需要创建的文件:\n");
scanf("%s", filename);
//注意问题:用来接收换行
getchar();
FILE* fp = fopen(filename, "w");
//判断文件可用性
if (!fp)
{
printf("打开文件失败!\n");
return -1;
}
char buf[1024];
while (1)
{
memset(buf, 0, 1024);
fgets(buf, 1024, stdin);
//comm=exit 代表程序结束
if (strncmp(buf, "comm=exit",9) == 0)
{
break;
}
int i = 0;
//将字符串写到文件中
while (buf[i])
{
fputc(buf[i++], fp);
}
//更新缓冲区
fflush(fp);
}
//关闭文件
fclose(fp);
return 0;
}
三、查看文本文件 cat
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
char fileName[256];
printf("请宁输入要查看的文件:\n");
//fgets(fileName, 256, stdin);
scanf("%s", fileName);
getchar();
FILE* fp = fopen(fileName, "r");
if (!fp)
return -1;
char ch;
//EOF 文件结束标志
while ((ch = fgetc(fp)) != EOF)
printf("%c", ch);
fclose(fp);
return 0;
}
四、四则运算
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
int main(void)
{
//插入随机数种子
srand((unsigned int)time(NULL));
FILE* fp = fopen("c.txt", "w");
if (!fp)
return -1;
int a, b;
char c;
char buf[20];
for (int i = 0; i < 100;i++)
{
switch (rand() % 4)
{
case 0:
c = '+';
break;
case 1:
c = '-';
break;
case 2:
c = '*';
break;
case 3:
c = '/';
break;
}
a = rand() % 10+1;
b = rand() % 10+1;
memset(buf, 0, 20);
sprintf(buf, "%d%c%d=\n", a, c,b);
/*int j = 0;
while (buf[j])
fputc(buf[j++], fp);*/
fputs(buf, fp);
}
fclose(fp);
return 0;
}
五、文件的加密解密
加密:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//从源文件中读取字符 进行加密 生成新的文件
int main(void)
{
FILE* fp1 = fopen("src.txt", "r");
FILE* fp2 = fopen("pas.txt", "w");
if (!fp1 || !fp2)
return -1;
//读源文件内容 直到EOF
char ch;
while ((ch = fgetc(fp1)) != EOF)
{
ch++;
fputc(ch, fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
解密:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//从加密文件中读取文件 进行解密 变成源文件
int main(void)
{
FILE* fp1 = fopen("pas.txt", "r");
FILE* fp2 = fopen("to_src.txt", "w");
if (!fp1 || !fp2)
return -1;
char ch;
while ((ch = fgetc(fp1)) != EOF)
{
ch--;
fputc(ch, fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
六、行读写
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main0601(void)
{
FILE* fp = fopen("d.txt", "w");
if(!fp)
return -1;
char* p;
p = "hello world\n";
fputs(p, fp);
p = "你好 世界";
fputs(p, fp);
fclose(fp);
return 0;
}
int main0602(void)
{
FILE* fp = fopen("d.txt", "r");
if (!fp)
return -1;
char buf[1024];
fgets(buf, 1024, fp);
printf("%s", buf);
memset(buf, 0, 1024);
fgets(buf, 1024, fp);
printf("%s", buf);
fclose(fp);
return 0;
}
//用行读写实现cat
int main0603(void)
{
FILE* fp = fopen("d.txt", "r");
if (!fp)
return -1;
char* buf = malloc(sizeof(char) * 1024);
//feof函数 判断文件流是否到结尾 到结尾返回值非零,没到结尾返回值为0
while (!feof(fp))
{
memset(buf, 0, 1024);
fgets(buf, 1024, fp);
printf("%s", buf);
}
free(buf);
fclose(fp);
return 0;
}
七、四则运算结果
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
//1、打开两个文件 c.txt e.txt
FILE* fp1 = fopen("c.txt", "r");
FILE* fp2 = fopen("e.txt", "w");
//2、判断可用性
if (!fp1 || !fp2)
return -1;
int a, b;
char c;
float value = 0;
char buf[20];
//3、循环读取
for (int i = 0; i < 100; i++)
{
fgets(buf, 20, fp1);
//4、格式化字符串 sscanf() 计算结果
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 * 1.0 / b;
break;
}
memset(buf, 0, 20);
sprintf(buf, "%d%c%d=%.2f\n", a, c, b, value);
//5、放到e.txt文件中
fputs(buf, fp2);
}
//6、文件关闭
fclose(fp1);
fclose(fp2);
return 0;
}
八、格式化读写内容(改进四则运算结果的程序)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
//1、打开两个文件 c.txt e.txt
FILE* fp1 = fopen("c.txt", "r");
FILE* fp2 = fopen("f.txt", "w");
//2、判断可用性
if (!fp1 || !fp2)
return -1;
int a, b;
char c;
float value = 0;
char buf[20];
//3、循环读取并做相应计算 放到e.txt文件中
for (int i = 0; i < 100; i++)
{
fscanf(fp1, "%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;
}
fprintf(fp2, "%d%c%d=%.2f\n", a, c, b, value);
}
//4、文件关闭
fclose(fp1);
fclose(fp2);
return 0;
}
九、大数据排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//随机10000个数据,1-1000 写入到文件中,读取出来,进行从小到大排序,再写入到文件中去
int main(void)
{
srand((unsigned int)time(NULL));
FILE* fp = fopen("g.txt", "w");
if (!fp)
return -1;
for (int i = 0; i < 10000; i++)
fprintf(fp, "%d\n", rand() % 1000 + 1);
fclose(fp);
int* p = (int*)malloc(sizeof(int) * 10000);
fp = fopen("g.txt", "r");
if (!fp)
return -1;
for (int i = 0; i < 10000; i++)
fscanf(fp, "%d", &p[i]);
for (int i=0; i < 10000 - 1; i++)
{
for (int j = 0; j < 10000 - 1 - i; j++)
{
if (p[j] > p[j + 1])
{
int temp=p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
fclose(fp);
fp = fopen("g.txt", "w");
if (!fp)
return -1;
for (int i = 0; i < 10000; i++)
fprintf(fp,"%d\n", p[i]);
fclose(fp);
free(p);
return 0;
}