目录
前言一、题目二、代码及效果[1]. 第一问[2]. 第二问[3]. 第三问总结前言
文件的读取和写入是使用的是
fscanf和fprintf两个函数,C语言中文件读取的函数不止这两个。文章中采用读取文件的方式有两个,输入行数和使用EOF判断文件末尾。%s进行读取时不需要使用取址符&,主要是用于输入字符数组。
环境:CodeBlocks 文本阅读软件:NotePadd++
一、题目
实验 I/O流设计
一、 实验目的:
熟悉文件流类的使用,掌握文件的打开、读写、关闭操作。
二、 实验时间:
三、 实验地点:
四、 实验内容:
1.输入任意多个学生的数据(学号,姓名,成绩),将数据存放在student.dat文件中,然后从该文件中读出所有数据并显示。
2.编程将2个文件的内容连成一个文件。
3.编写程序,给一个文本文件加上行号后存到另外一个文件中。
五、实验要求:在上机前写出全部源程序;
六、实验结果分析:
二、代码及效果
[1]. 第一问


#include<stdio.h>
struct student{
char number[20];//学号
char name[20];//姓名
int score;//成绩
}stu[100];//学生结构体数组
int main()
{
FILE *file1 = fopen("student.dat","w");//文件指针,写
FILE *file2;//文件指针,读
int i;
int num = 0;//学生个数
printf("学生个数:");
scanf("%d",&num);
fprintf(file1,"%d\n",num);//将学生个数放在文件首行
for(int i = 0;i < num;i++){//输入学生信息
printf("第%d位学生\n",i+1);
printf("学号: ");
scanf("%s", stu[i].number);//学号
printf("姓名: ");
scanf("%s", stu[i].name);//姓名
printf("成绩: ");
scanf("%d", &stu[i].score);//成绩
//存入文件
fprintf(file1,"%s %s %d\n",stu[i].number,stu[i].name,stu[i].score);
}
fclose(file1);//关闭文件指针
file2 = fopen("student.dat","r");//读取文件
fscanf(file2,"%d",&num);//读取第一行的学生个数
//printf("%d\n",num);
for(int i = 0;i < num;i++){//显示文件的数据
//局部变量
char number[20];
char name[20];
int score;
//获取当前行的数据
fscanf(file2,"%s",number);
fscanf(file2,"%s",name);
fscanf(file2,"%d",&score);
//打印
printf("第%d位学生: %s %s %d\n",i+1,number,name,score);
}
fclose(file2);
return 0;
}
[2]. 第二问





#include<stdio.h>
struct student{
char number[20];//学号
char name[20];//姓名
int score;//成绩
}stu1[100],stu2[100];//学生结构体数组
int main()
{
int i,num1,num2;
char file_name1[20];
char file_name2[20];
char file_name3[20];
FILE *file1,*file2,*file3;//文件指针
file1 = fopen("student1.dat","r");//读取文件1
file2 = fopen("student2.dat","r");//读取文件2
file3 = fopen("student3.dat","w");//写入文件3
//获取文件1内容
fscanf(file1,"%d",&num1);//读取第一行的学生个数
for(int i = 0;i < num1;i++){
fscanf(file1,"%s",stu1[i].number);
fscanf(file1,"%s",stu1[i].name);
fscanf(file1,"%d",&stu1[i].score);
//printf("第%d位学生: %s %s %d\n",i+1,stu1[i].number,stu1[i].name,stu1[i].score);
}
//获取文件2内容
fscanf(file2,"%d",&num2);//读取第一行的学生个数
for(int i = 0;i < num2;i++){
fscanf(file2,"%s",stu2[i].number);
fscanf(file2,"%s",stu2[i].name);
fscanf(file2,"%d",&stu2[i].score);
//printf("第%d位学生: %s %s %d\n",i+1,stu2[i].number,stu2[i].name,stu2[i].score);
}
//写入文件3
fprintf(file3,"%d\n",num1+num2);
for(int i = 0;i < num1;i++){//遍历stu1数组
fprintf(file3,"%s %s %d\n",stu1[i].number,stu1[i].name,stu1[i].score);
}
for(int i = 0;i < num1;i++){//遍历stu2数组
fprintf(file3,"%s %s %d\n",stu2[i].number,stu2[i].name,stu2[i].score);
}
//printf("已将student1.dat和student2.dat内容存入student3.dat");
printf("复制成功!");
fclose(file1);
fclose(file2);
fclose(file3);
return ;
}
[3]. 第三问




#include<stdio.h>
#include<string.h>
struct text
{
char str[100];//字符数组,存储每行的数据
}t[100];//结构体数组
int main(){
FILE *file1 = fopen("stu1.dat","r");//文件指针,读
FILE *file2 = fopen("stu2.dat","w");//文件指针,写
int i,num = 0;
//读
while(1){//遍历文件stu1.dat
char str[100];
if(fscanf(file1,"%s",str)==EOF){//若读取到最后一行时
printf("文件读取结束!\n");
break;
}else{
strcpy(t[num].str,str);//将字符数组复制到结构体数组
num++;//定位到下一个结构体
}
}
//写入文件
for(int i = 0;i < num;i++){//遍历结构数组t
//printf("%s\n",t[i].str);
fprintf(file2,"%d%s\n",i+1,t[i].str);
}
fclose(file1);
fclose(file2);
return 0;
}
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!

