【C语言】基本文件操作案例—顺序读写+随机读写

以下内容均为自用,不喜误喷

一、读取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 <stdio.h>
#include <stdlib.h>

void sort(int a[20],int n)//从小到大的排序函数
{
    
    
    int i,j,t;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n-i-1;j++)
        {
    
    
            if(a[j+1]<a[j])
            {
    
    
                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<n;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<n;i++) //step4:将数据写入
        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 <stdio.h>
#include <stdlib.h>
#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<n;i++,p++)
    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 <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>

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<len;i++)
        p[i]=fgetc(fp);
    p[i]='\0';
     printf("原的数据为:\n");
    printf("%s\n",p);
    for(i=0;i<len;i++)
        p[i]=~p[i];
    printf("按位取反后的数据为:\n");
    printf("%s\n",p);
    rewind(fp);
    fputs(p,fp);
    fclose(fp);
    free(p);
    return 0;
}

4.输出结果+文件更改后
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46126258/article/details/106576410