c语言原始数据输入案例,【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

#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.输出结果+文件更改后

0dd93fd914495134afbb02a230bdf526.png322ec691d59d57c21b2b381a2521951d.png53d030f2f87ca9d99c50d211f11d4787.png

二、将键盘输入的数据存入a文件

1、题目说明

524a62b882d02c37ff2fc376a6183409.png

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.输出结果+文件更改后

f261dd6f62e954da98d69370451f52a0.png

5caa9b67ab04bc7e5c4e0033587f68f2.png

d16b9d69abe9420c548c26977ae14064.png

三、随机读写找第n个同学的信息

1、题目说明

6c7964d6a87e1a4b8ddbca0ffe5676d2.png

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,输出结果为第二个学生信息

688978e939c2b750a828e799f8a03316.png

四、顺序读写a文件+加密

1、题目说明

7d5d85709e4e8947d9dacbae8ec3b7f7.png

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.输出结果+文件更改后

9fd12f87587d18c2800c3e83f41f1885.png

8d72e431598daf5afd677d88ff702611.png

2442fb1c24b20d45a4063661fcfb9b63.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值