任务一:
你现在拥有一个数组,数组中储存着总共10个人的姓名字符串
你需要为每个人创建一个txt文件,以他们的名字命名。
例如: 生成 笨笨.txt文件
代码展示:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
FILE* fp;//定义文件指针(必须要指针)
int i;
char name_classmates[10][20] = { "画眉","夜鹰","鸬鹚","织布鸟","白头翁","白鹭","翠鸟","雕鸮","蜂鸟","海雕" };//十个字符串名字
for (i = 0; i < 10; i++) {
strcat(name_classmates[i], ".txt");//txt文件后缀
if ((fp = fopen(name_classmates[i], "w")) == NULL) {
printf("%s file open error!
",name_classmates[i]);
exit(0);//防止异常,关闭流
}//逐个建立文件
if (fclose(fp)) {
printf("close the file
");
exit(0);
}
}
return 0;
}
运行结果:
任务二:
在任务一的基础上,这次不仅仅要创建txt文件,还需要往文件中写入
每个人的学号,性别,班级,线代成绩
代码展示:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define V 10
int main() {
system("color F9");
char number[V][N];//学号
char sex[V][N];//性别
char classes[V][N];//班级
char score[V][N];//分数
FILE* fp;
int i;
char name_classmates[10][20] = { "画眉","夜鹰","鸬鹚","织布鸟","白头翁","白鹭","翠鸟","雕鸮","蜂鸟","海雕" };
for (i = 0; i < 10; i++) {
strcat(name_classmates[i], ".txt");
fp = fopen(name_classmates[i], "w");
if (fp)
{
printf("请输入学生%s的性别: ", name_classmates[i]);
scanf("%s", sex[i]);
printf("请输入学生%s的学号: ",name_classmates[i]);
scanf("%s", number[i]);
printf("请输入学生%s的班级: ", name_classmates[i]);
scanf("%s", classes[i]);
printf("请输入学生%s的分数: ", name_classmates[i]);
scanf("%s", score[i]);
fputs(number[i], fp);
fprintf(fp, " ");
fputs(sex[i], fp);
fprintf(fp, " ");
fputs(classes[i], fp);
fprintf(fp, " ");
fputs(score[i], fp);
printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※
");
if (i != 0&&i % 2 == 0)
{
system("cls");
system("pause");
}
fclose(fp);//关闭文件
}
else
{
printf("File open fail.
");
break;
}
}
return 0;
}
运行结果截图
任务三:
在任务二生成的文件中,将每个人的信息再重新读取出来,放入数组中。
[要求使用结构体数组,结构体需要包含姓名,学号,性别,班级,线代成绩5个属性]
代码展示
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define V 10
struct student
{
char name[N];//名字
char number[N];//学号
char sex[N];//性别
char score[N];//分数
char classes[N];//班级
}stu[10];
int main() {
system("color F9");
FILE* fp;
int i;
char name_classmates[10][20] = { "画眉","夜鹰","鸬鹚","织布鸟","白头翁","白鹭","翠鸟","雕鸮","蜂鸟","海雕" };
for (i = 0; i < 10; i++)
{
strcpy(stu[i].name, name_classmates[i]);
strcat(name_classmates[i], ".txt");
fp = fopen(name_classmates[i], "r");
if (fp)
{
fscanf(fp, "%s %s %s %s", stu[i].number, stu[i].sex, stu[i].classes, stu[i].score);//读取文件内容并放入结构体中
fclose(fp);
}
else
{
printf("File open fail.
");
break;
}
}
for (i = 0;i < 10;i++)
{
printf("%s %s %s %s %s
", stu[i].name, stu[i].number, stu[i].sex, stu[i].classes, stu[i].score);
}
return 0;
}
运行结果截图
任务四:
试着使用一下system("cls"),system("pause")这两个命令,看看这两个
命令能不能对你的程序起到一些美化的作用。
拓展:上网搜索类似的其他函数,使用并解释他们的作用。
- system("CLS")可以实现清屏操作;
- system("pause")可以实现冻结屏幕,便于观察程序的执行结果;
- 用 system("color 0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色 5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色 A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色 F=亮白色
五.小结
通过这次大作业,我对文件有了以下初步的了解:
- fopen(),fclose函数是用来打开和关闭文件的,若打开失败,就会返回NULL,函数里放的是打开的文件路径或文件名,参数mode字符串代表流行态。
形态字符串 | 特点 |
---|---|
r | 以只读的方式打开文件,该文件必须存在 |
r+ | r+以可读写方式打开,该文件必须存在 |
a+ | 打开读写文件文件不存在,则新建,存在。写入的数据会被加到文件尾后,文件原先内容会被保留(原来的EOF不保留) |
rw+ | rw+读写打开一个文本文件,允许读和写 |
w | w打开只写文件,若文件存在则文件长度轻为0,则该文件内容会消失,若文件不存在,则建立该文件 |
w+ | a以附加方式打开只写文件,若文件存在,则文件长度会被清零,文件内容会消失 |
a | 以附加的方式打开只写文件,若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后(原来的EOF符保留) |
at+ | 打开一个叫string的文件,a表示append,写入处理的时候接着原有文件写入,t表示打开文本文件,+表示可读写 |
wb | 只写打开或新建一个二进制文件。只允许写数据 |
wb+ | 读写打开或建立一个二进制文件。允许读和写 |
ab+ | 读写打开一个二进制文件,允许读或在文件末追加数据 |
rb+ | rb+读写打开一个二进制文件,允许读写数据 |
上述的形态字符串都可以再加一个b字符,如
rb,w+b或ab+等组合,加入b字符用来告诉函数以二进制模式打开文件,如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。
- 格式化方式读写文件:fscanf()函数和fprintf()函数
定义:
fscanf(文件指针,格式字符串,输入表);
fprintf(文件指针,格式字符串,输入表)
- 字符方式读写文件:fgetc(),fputc(),用于复制文件
- 字符串方式文件读写函数fgets()fputs()
作用:
fputs()函数用来向指定的文本文件写入一个字符串
fgets()从文本文件中读取字符串
格式:
fputs(s,fp);
fgets(s,n,fp);//n是指定读入字符的个数