1.文件型指针,指向文件结构体的指针,文件结构体在文件打开之后自动填充其中的内容。文件指针可以方便的对文件进行操作,其中包含的各种文件模式适合于文件的各种操作类型。
2.文件的打开包含打开文件的信息区和文件的缓存区,打开文件将数据写入到缓冲区,关闭文件,缓冲区文件写入文件,关闭缓冲区,关闭信息区。
3.小写转大写
#include <stdio.h>
int main()
{
FILE *fp;
char filename[10],ch;
printf("请输入文件名:\n");
scanf("%s",filename);
if ((fp = fopen(filename,"w")) == NULL)
{
printf("can not open the file: \n");
return 0;
}
ch = getchar();
printf("输入字符串,结尾以#结束:\n");
ch = getchar();
while(ch != '#')
{
if ( ch > 'a' && ch < 'z')
{
ch = ch - 32;
}
putc(ch,fp);
ch = getchar();
}
putc('!',fp);
fclose(fp);
return 0;
}
4.文件信息合并
#include <stdio.h>
int main()
{
FILE *fp1,*fp2,*fp3;
char ch;
printf("打开file1.bat\n");
if ((fp1 = fopen("file1.bat","r")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
printf("打开file2.bat\n");
if ((fp2 = fopen("file2.bat","r")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
printf("打开file3.bat\n");
if ((fp3 = fopen("file3.bat","w")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
printf("file1.bat的内容\n");
while (!feof(fp1))
{
ch = fgetc(fp1);
fputc(ch,fp3);
putchar(ch);
}
printf("file2.bat的内容\n");
while (!feof(fp2))
{
ch = fgetc(fp2);
fputc(ch,fp3);
putchar(ch);
}
putchar(10);
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
5.文件与结构体
#include <stdio.h>
struct student{
int num;
char name[10];
float score[3];
}stu[5];
int main()
{
FILE *fp;
for (int i = 0; i < 5;i++)
{
printf("请输入第%d个学生的学号姓名以及三门课程的成绩:\n",i+1);
scanf("%d%s%f%f%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
//向二进制文件读入一组数据
if ((fp = fopen("stu.txt","w")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
float aver;
fprintf(fp,"学号\t姓名\t分数1 分数2 分数3 平均分\n");
for (int i = 0;i < 5;i++)
{
/*if (fwrite(&stu[i],sizeof(struct student),1,fp) != 1)
{
printf("文件写入出错\n");
}*/
aver = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
aver /= 3.0;
fprintf(fp,"%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver);
}
return 0;
}
6.先排序再存入
#include <stdio.h>
struct student{
int num;
char name[10];
float score[3];
}stu[5];
int main()
{
FILE *fp1,*fp2;
float aver[5];
struct student temp1;
float temp2;
//读入stu的数据
if ((fp1 = fopen("stu.txt","r")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
for (int i = 0; i < 5;i++)
{
//printf("读入第%d个学生的学号、姓名、成绩、平均分:\n",i+1);
fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&aver[i]);
printf("%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
}
//平均分排序处理
for (int i = 0;i < 4;i++)
{
for (int j = 0;j < 4- i;j++)
{
if (aver[j] > aver[j+1] )
{
temp2 = aver[j];
aver[j] = aver[j+1];
aver[j+1] = temp2;
temp1 = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp1;
}
}
}
//写入stu_sort数据
if ((fp2 = fopen("stu_sort.txt","w")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
fprintf(fp2,"学号\t姓名\t分数1 分数2 分数3 平均分\n");
for (int i = 0;i < 5;i++)
{
fprintf(fp2,"%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
}
fclose(fp1);
// fclose(fp2);
return 0;
}
7.插入文件
#include <stdio.h>
struct student{
int num;
char name[10];
float score[3];
}stu[5];
int main()
{
FILE *fp1,*fp2;
float aver[5];
struct student temp1;
float temp2;
//读入stu的数据
if ((fp1 = fopen("stu.txt","r")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
for (int i = 0; i < 5;i++)
{
//printf("读入第%d个学生的学号、姓名、成绩、平均分:\n",i+1);
fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&aver[i]);
printf("%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
}
//平均分排序处理
for (int i = 0;i < 4;i++)
{
for (int j = 0;j < 4- i;j++)
{
if (aver[j] > aver[j+1] )
{
temp2 = aver[j];
aver[j] = aver[j+1];
aver[j+1] = temp2;
temp1 = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp1;
}
}
}
//写入stu_sort数据
if ((fp2 = fopen("stu_sort.txt","w")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
fprintf(fp2,"学号\t姓名\t分数1 分数2 分数3 平均分\n");
for (int i = 0;i < 5;i++)
{
fprintf(fp2,"%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
}
fclose(fp1);
// fclose(fp2);
return 0;
}
#include <stdio.h>
struct student{
int num;
char name[10];
float score[3];
float aver;
}stu[6];
int main()
{
FILE *fp1;
struct student temp1;
int i = 0;
//读入需要插入的数据
printf("输入需要插入的学生数据\n");
scanf("%d%s%f%f%f",&temp1.num,&temp1.name,&temp1.score[0],&temp1.score[1],&temp1.score[2]);
temp1.aver = (temp1.score[0] + temp1.score[1] + temp1.score[2])/3.0;
//打开文件
if ((fp1 = fopen("stu_sort.txt","r")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
for ( i = 0; i < 5;i++)
{
fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].aver);
}
for ( i = 4;i >= 0 && temp1.aver < stu[i].aver;i--)
{
stu[i+1] = stu[i];
}
stu[i+1] = temp1;
if ((fp1 = fopen("stu_sort.txt","w")) == NULL)
{
printf("打开文件失败:\n");
return -1;
}
for (int i = 0;i < 6;i++)
{
fprintf(fp1,"%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
printf("%d\t%s\t%5.2f %5.2f %5.2f %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
}
fclose(fp1);
return 0;
}
9.部分数据转存
#include <stdio.h>
#include <string.h>
struct employee{
char name[10];
int id;
char sex;
int age;
char addr[10];
int money;
char health;
char edu;
}emp[10];
struct Need
{
char name[10];
int salary;
}need[10];
int main()
{
FILE *fp,*fp1;
int i;
if ((fp = fopen("employee.bat","r")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
for ( i = 0;fread(&emp[i],sizeof(struct employee),1,fp)!=0;i++)
{
strcpy(need[i].name,emp[i].name);
need[i].salary = emp[i].money;
}
if ((fp = fopen("salary.bat","w")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
for (int j = 0;j <i;j++)
{
if (fwrite(&need[i],sizeof(Need),1,fp1) != 1)
{
printf("error");
}
}
fclose(fp1);
fclose(fp);
return 0;
}
10.删除部分数据
#include <stdio.h>
#include <string.h>
struct employee{
char name[10];
int id;
char sex;
int age;
char addr[10];
int money;
char health;
char edu;
}emp[10];
int main()
{
FILE *fp;
int i,id;
int no;
if ((fp = fopen("employee.bat","r")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
printf("输入需要删除的id:");
scanf("%d",&id);
for ( i = 0;fread(&emp[i],sizeof(struct employee),1,fp)!=0;i++)
{
if (emp[i].id == id)
{
no = i;
}
}
for (int j = no;j<i-1;j++)
{
emp[j] = emp[i+1];
}
if ((fp = fopen("employee.bat","w")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
for (int j = 0;j < i - 1;j++)
{
if (fwrite(&emp[i],sizeof(emp),1,fp) != 1)
{
printf("error");
}
}
fclose(fp);
return 0;
}
11.字符串处理
#include <stdio.h>
int main()
{
char string[10][10];
FILE *fp;
if ((fp = fopen("file1.txt","w")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
for (int i = 0;i < 10;i++)
{
gets(string[i]);
fprintf(fp,"%s\n",string[i]);
}
if ((fp = fopen("file1.txt","r")) == NULL)
{
printf("打开文件失败\n");
return -1;
}
for (int i = 0;i < 10;i++)
{
fscanf(fp,"%s",string[i]);
for (int j = 0;string[i][j] != '\0';j++)
{
if ( string[i][j] >= 'a' && string[i][j] <= 'z')
{
string[i][j] -= 32;
}
}
printf("%s\n",string[i]);
}
fclose(fp);
return 0;
}
总结:
有几个问题:
1.二进制文件的读写使用fread,fwrite,对比于非二进制fprintf 和 fscanf速度快,但是输出的文件看不出效果
2.对于文件的读写
r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容
w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。