文件打开与关闭
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,以便下一次检测