while(fgets(h,sizeof(struct grade),info)!=NULL) { fseek(info,sizeof(struct grade)*i,0); fread(&g_stu[i],sizeof(struct grade),1,info); i++; }什么意思
时间: 2024-03-19 16:41:43 浏览: 94
这段代码是从文件中读取学生成绩信息。具体来说,它通过 `fgets` 函数从文件中读取一行字符,每行字符的长度是 `sizeof(struct grade)`,也就是学生成绩信息的结构体大小。然后使用 `fseek` 函数将文件指针移动到第 `i` 个学生的成绩信息的起始位置,接着使用 `fread` 函数读取该学生的成绩信息并存储到 `g_stu[i]` 结构体中,最后 `i` 自增 1,继续读取下一个学生的成绩信息。通过这种方式,可以从文件中读取所有学生的成绩信息。
相关问题
以下程序段为什么会报无法解析的外部符号 "void_cdecl insert_file(struct_iobuf *,char *)" (?insert_file@@YAXPAU_iobuf@@PAD@Z),该符号在函数 "void_cdecl edit(void)" (?edit@@YAXXZ) 中被引用:// 插入函数 void insert_file(char *fname) { char ch; long int pos; // 获取用户输入的文件名 printf("\t请输入插入的文件名:\n\t"); // 从标准输入中获取文件名 fgets(fname, MAX_LEN, stdin); // 查找'\n'字符并替换为'\0' char *pos1 = NULL; if ((pos1 = strchr(fname, '\n')) != NULL) *pos1 = '\0'; // 添加后缀名".txt",如果没有输入 if (!strstr(fname, ".txt")) strcat(fname, ".txt"); // 判断文件是否存在,如果不存在则提示重新输入文件名 FILE *fp = NULL; while ((fp = fopen(fname, "a+")) == NULL) { printf("\t文件不存在,请重新输入:\n\t"); fgets(fname, MAX_LEN, stdin); if ((pos1 = strchr(fname, '\n')) != NULL) *pos1 = '\0'; if (!strstr(fname, ".txt")) strcat(fname, ".txt"); } fclose(fp); // 关闭文件 // 打开文件并判断是否打开成功 if ((fp = fopen(fname, "a+")) == NULL) { printf("\t不能打开文件!\n"); exit(0); } // 获取用户输入的插入位置 printf("\t请输入要插入的位置:\n\t"); scanf("%ld", &pos); getchar(); // 消耗掉输入缓冲区中的回车符 // 将文件指针移动到指定位置 fseek(fp, pos, SEEK_SET); // 获取用户输入的插入内容并写入文件中 printf("\t请输入要插入的内容:\n\t"); ch = getchar(); while (ch != '#') { fwrite(&ch, sizeof(char), 1, fp); ch = getchar(); } printf("\n\n"); fclose(fp); // 关闭文件 }
程序段中的函数 `insert_file` 在 `edit` 函数中被引用,但是编译器无法找到该函数的定义。这可能是因为 `insert_file` 函数的定义在 `edit` 函数的定义之后,或者 `insert_file` 函数定义所在的源文件没有被编译并链接到可执行文件中。要解决这个错误,可以将 `insert_file` 函数的定义放在 `edit` 函数的定义之前,或者确保将 `insert_file` 函数所在的源文件编译并链接到可执行文件中。
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` 类型的结构体数组,并将学生信息存储到结构体数组中。最后,将结构体数组中的学生信息输出到用户指定的文件中。
阅读全文