以下内容均为自用,不喜误喷
一、读取a文件写入b文件
1、题目说明:
读取 “D:\软件:\cd文件:\文件操作:\测试数据.txt” 的数据并进行显示,按从小到大排序后存入 “D:\软件:\cd文件:\文件操作:\排序数据.txt” 中
2、思路
step1:打开两个文件,用FILE*类型的指针 fa,fb指向两文件(两文件均保存在同一路径下,因为 ”测试数据.txt“ 可读所以用r模式,“排序数据.txt” 可写,所以用w模式,)
step2:定义数组a,从fa中读取 “测试数据.txt” 中的数据,并用n++求数据的总个数,将读取的数据存入数组a中
step3:对数组a进行排序
step4:通过fb将数组a中的数据存入 “排序数据.txt” 中
3、代码实现
#include
#include
void sort(int a[20],int n)//从小到大的排序函数
{
int i,j,t;
for(i=0;i
{
for(j=0;j
{
if(a[j+1]
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
void output(int a[20],int n)//输出函数
{
int i;
for(i=0;i
printf("%d ",a[i]);
}
int main()
{
FILE *fa=fopen("测试数据.txt","r"); //step1:打开文件
FILE *fb=fopen("排序数据.txt","w");
int a[20],i,n=0;
if(fa==NULL||fb==NULL)//提示信息
{
printf("文件打开失败!\n");exit(1);
}
else
printf("文件打开成功!\n");
while(fscanf(fa,"%d",a+n)!=EOF) n++; //step2:读取信息存入数组a
//因为fscanf读取失败返回EOF
output(a,n);
sort(a,n);//step3:排序
for(i=0;i
fprintf(fb,"%d ",a[i]);
fclose(fa);
fclose(fb);
return 0;
}
4.输出结果+文件更改后
二、将键盘输入的数据存入a文件
1、题目说明
ps.我文件保存的位置和题目要求不太一样,纯属个人喜好
2、思路
step1:将从键盘输入的n、n个学生信息,保存在大小为n的动态数组中,首地址保存于指针p
step2:打开文件,将数组中元素存入文件(stu.dat需要可写,并且是二进制文件,所以用wb模式)
step3:数据存入文件用fwrite,读取文件数据用fread
step4:关闭文件释放内存
3、代码实现
#include
#include
#define LEN sizeof(struct student)
//等价于#define LEN sizeof(Student)
typedef struct student
{
int num;
char name[20];
int age;
double score;
}Student,*StudentPointer;
int main()
{
FILE *fp=NULL;
char *s="d:\\软件\\cd文件\\stu.dat";
StudentPointer p=NULL,q;
//等价于 struct student *p,*q;
int n,i;
scanf("%d",&n);
q=p=(StudentPointer)malloc(n*LEN);//申请动态数组
for(i=0;i
scanf("%d %s %d %lf",&p->num,p->name,&p->age,&p->score);
fp=fopen(s,"w");//打开文件
if(fp==NULL) {printf("文件打开失败!\n");exit(1);}
fwrite(q,LEN,n,fp);//存入数据
if(fclose(fp)==0)
printf("保存成功!\n");
free(q);//释放内存
return 0;
}
/*
测试样例
3
2019224335 lyh 19 100
2019222111 ttt 18 99
2019222777 tto 29 22
*/
4.输出结果+文件更改后
三、随机读写找第n个同学的信息
1、题目说明
2、思路
step1:接收n的值
step2:打开文件(因为是二进制文件且要可读所以用rb模式)打开失败会返回NULL
step3:fseek函数将文件位置标记移动到第n个同学的位置(即跳过n-1个学生)
step4:fread函数将读取到的len字节的数据存入结构体变量s中
step5:显示学生信息,关闭文件
3、代码实现
#include
#include
#define LEN sizeof(struct student)
//等价于#define LEN sizeof(Student)
typedef struct student
{
int num;
char name[20];
int age;
double score;
}Student;
int main()
{
int n,i;
Student s;
scanf("%d",&n);
FILE *fp=fopen("d:\\软件\\cd文件\\stu.dat","rb");//打开文件
if(fp==NULL)
{
printf("文件打开失败!\n");
exit(1);
}
fseek(fp,(n-1)*LEN,SEEK_SET);
if(fread(&s,LEN,1,fp)==1)
printf("%d %s %d %.1lf\n",s.num,s.name,s.age,s.score);
else
{
printf("读取失败\n");
exit(1);
}
fclose(fp);
return 0;
}
4.输出结果
输入2,输出结果为第二个学生信息
四、顺序读写a文件+加密
1、题目说明
2、思路
step1:代开文件,对文件可读可写用r+
step2:feek函数让文件位置标记指向文件尾,ftell函数获取文件长度len,申请len+1个字符空间存储文件,内存空间首地址保存于p
step3:rewind函数将文件位置标记再次指向文件头,用fgetc函数顺序读文件
step4:利用循环对p指向的对动态数组的数据进行加密
step5:rewind函数将文件位置标记指向文件头,用fputc将动态数组的数据存入文件
step6:关闭文件,释放内存
3、代码实现
#include
#include
int main()
{
char * filename="测试数据.txt",*p;
int len,i;
FILE *fp=fopen(filename,"r+");//打开文件
if(fp==NULL)
{
printf("文件打开失败!\n");
exit(1);
}
fseek(fp,0,SEEK_END);//文件位置指针指向末尾,获取长度
len=ftell(fp);
p=(char *)malloc((len+1)*sizeof(char));//申请动态数组
printf("文章中共有%d个字符\n",len);
rewind(fp);//指向文件头,将文件数据存入数组进行显示
for(i=0;i
p[i]=fgetc(fp);
p[i]='\0';
printf("原的数据为:\n");
printf("%s\n",p);
for(i=0;i
p[i]=~p[i];
printf("按位取反后的数据为:\n");
printf("%s\n",p);
rewind(fp);
fputs(p,fp);
fclose(fp);
free(p);
return 0;
}
4.输出结果+文件更改后