6-2 有结构文件的读写1 分数 10 全屏浏览题目 切换布局 作者 龚雄兴 单位 湖北文理学院 学生类型:ST的类型定义如下: typedef struct student{ char name[10],id[10]; int gender; int age; double scored; } ST; 编写函数,从指定的文件上读入若干字符串,每行字符串是一个学生的信息(姓名,学号,性别,年龄,分数)的字符串表示,数据间以空格分隔,将学生们的信息存储于一个结构体中,并利用output()函数输出到指定文件中。 函数接口定义: void fun(FILE *fin,FILE *fout); 其中 fin 和 fout 都是用户传入的参数。 前者是已正常打开的可读文件,而后者是已正常打开的可写文件。
时间: 2023-12-10 17:42:55 浏览: 1190
以下是代码实现:
```c
void fun(FILE *fin, FILE *fout) {
ST stu;
char line[50];
while (fgets(line, 50, fin) != NULL) {
sscanf(line, "%s %s %d %d %lf", stu.name, stu.id, &stu.gender, &stu.age, &stu.scored);
fprintf(fout, "Name: %s, ID: %s, Gender: %d, Age: %d, Score: %.2lf\n", stu.name, stu.id, stu.gender, stu.age, stu.scored);
}
}
```
首先定义了一个 ST 结构体来存储每个学生的信息。然后利用 fgets 函数逐行读取文件,再使用 sscanf 函数将每行字符串解析为相应的学生信息,存储到结构体中。最后使用 fprintf 函数将学生信息输出到指定文件中。注意输出时要按照指定格式输出,如添加“Name:”、“ID:”等提示信息。
相关问题
6-2 有结构文件的读写1 分数 10 全屏浏览题目 切换布局 作者 龚雄兴 单位 湖北文理学院 学生类型:ST的类型定义如下: typedef struct student{ char name[10],id[10]; int gender; int age; double scored; } ST
好的,我已经明白了你的问题。关于有结构文件的读写,可以通过以下步骤实现:
1. 定义ST类型,并在程序中使用它。
2. 打开文件,读取或写入结构体数据。
3. 关闭文件。
下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct student {
char name[10], id[10];
int gender, age;
double scored;
} ST;
int main() {
FILE *fp;
ST st, read_st;
// 写入数据到文件
fp = fopen("students.txt", "wb");
if (fp == NULL) {
printf("打开文件失败!\n");
exit(1);
}
st.gender = 1;
st.age = 20;
st.scored = 98.5;
strcpy(st.name, "小明");
strcpy(st.id, "1001");
fwrite(&st, sizeof(ST), 1, fp);
fclose(fp);
// 从文件读取数据
fp = fopen("students.txt", "rb");
if (fp == NULL) {
printf("打开文件失败!\n");
exit(1);
}
fread(&read_st, sizeof(ST), 1, fp);
printf("姓名:%s\n", read_st.name);
printf("学号:%s\n", read_st.id);
printf("性别:%d\n", read_st.gender);
printf("年龄:%d\n", read_st.age);
printf("成绩:%f\n", read_st.scored);
fclose(fp);
return 0;
}
```
在上面的代码中,我们定义了一个名为ST的结构体类型,并在程序中定义了一个ST类型的变量st和read_st。然后,我们通过打开文件、读取或写入结构体数据、关闭文件的方式进行了文件操作。
在写入数据时,我们使用了fwrite()函数将结构体数据写入文件。在读取数据时,我们使用了fread()函数从文件中读取结构体数据。
需要注意的是,结构体中的成员变量需要一个一个地写入或读取,而不能使用字符串和格式化输出等函数。此外,还需要注意文件打开模式,以确保文件能够正确地读写。
6-2 有结构文件的读写1 分数 10 作者 龚雄兴 单位 湖北文理学院 学生类型:ST的类型定义如下: typedef struct student{ char name[10],id[10]; int gender; int age; double scored; } ST; 编写函数,从指定的文件上读入若干字符串,每行字符串是一个学生的信息(姓名,学号,性别,年龄,分数)的字符串表示,数据间以空格分隔,将学生们的信息存储于一个结构体中,并利用output()函数输出到指定文件中。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{
char name[10],id[10];
int gender;
int age;
double scored;
} ST;
void output(ST *st, int n, char *filename){
FILE *fp;
fp = fopen(filename, "w");
if(fp == NULL){
printf("Error opening file!\n");
exit(1);
}
for(int i=0; i<n; i++){
fprintf(fp, "Name:%s ID:%s Gender:%d Age:%d Score:%.2lf\n", st[i].name, st[i].id, st[i].gender, st[i].age, st[i].scored);
}
fclose(fp);
}
int main(){
char filename[20];
printf("Please enter the input filename: ");
scanf("%s", filename);
FILE *fp;
fp = fopen(filename, "r");
if(fp == NULL){
printf("Error opening file!\n");
exit(1);
}
int n = 0;
char str[100];
while(fgets(str, 100, fp) != NULL){
n++;
}
fseek(fp, 0, SEEK_SET);
ST *st = (ST*)malloc(n*sizeof(ST));
for(int i=0; i<n; i++){
fscanf(fp, "%s %s %d %d %lf", st[i].name, st[i].id, &st[i].gender, &st[i].age, &st[i].scored);
}
fclose(fp);
printf("Please enter the output filename: ");
scanf("%s", filename);
output(st, n, filename);
free(st);
return 0;
}
```
该程序先从用户输入的文件名中读取学生信息,然后在内存中动态分配一个 `ST` 类型的结构体数组,并将学生信息存储到结构体数组中。最后,将结构体数组中的学生信息输出到用户指定的文件中。
阅读全文