while (fscanf(fp,"%s %s %s", Student[i].czName, Student[i].czNumber, Student[i].guli) != EOF) { nCount++; // i++; }
时间: 2024-03-02 12:50:32 浏览: 14
这段代码中,使用fscanf()函数从文件中读取数据。fscanf()函数的返回值是成功读取的参数数量,如果返回值不等于3,则说明读取失败或到达文件末尾。因此,while循环的条件应该是:
```c
while (fscanf(fp, "%s %s %s", Student[i].czName, Student[i].czNumber, Student[i].guli) == 3)
```
这样,只有在成功读取3个参数时,while循环才会继续执行。另外,由于变量i没有初始化,使用i来访问数组Student是不安全的。您应该使用另一个变量来追踪数组Student中的元素数量,例如:
```c
int nCount = 0;
while (fscanf(fp, "%s %s %s", Student[nCount].czName, Student[nCount].czNumber, Student[nCount].guli) == 3) {
nCount++;
}
```
这样,每次成功读取3个参数时,数组Student中的元素数量就会增加。
相关问题
include <stdio.h> #define MAX 100 // 最大学生数量 struct Student { char czName[20]; // 学生姓名 char czNumber[20]; // 学生学号 char guli[8]; }; int main() { FILE* fp = fopen("students.txt", "r+"); if (fp == NULL) { printf("Failed to open file!\n"); exit(0); } struct Student Student[MAX]; // 定义结构体数组 int i=0; int nCount=0; while (fscanf(fp,"%s %s %s", Student[i].czName,Student[i].czNumber,Student[i].guli) ==3) { nCount++; // i++; } fclose(fp); // 打印学生信息 for (i = 0; i < nCount; i++) { printf("%s %s %s\n", Student[i].czName, Student[i].czNumber, Student[i].guli); }用swtich进行排序
好的,你的问题是如何使用 switch 语句对学生信息进行排序?
首先,要确定按照哪个字段进行排序,例如按照学生学号进行排序。然后,可以使用冒泡排序算法对学生信息进行排序。
冒泡排序算法是一种简单的排序算法,它的基本思想是通过相邻元素之间的比较和交换来将较大的元素向数组的一端移动,从而实现排序。
以下是使用 switch 和冒泡排序算法对学生信息按照学号进行排序的示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX 100 // 最大学生数量
struct Student {
char czName[20]; // 学生姓名
char czNumber[20]; // 学生学号
char guli[8];
};
int main() {
FILE* fp = fopen("students.txt", "r+");
if (fp == NULL) {
printf("Failed to open file!\n");
exit(0);
}
struct Student Student[MAX]; // 定义结构体数组
int i = 0;
int nCount = 0;
while (fscanf(fp, "%s %s %s", Student[i].czName, Student[i].czNumber, Student[i].guli) == 3) {
nCount++;
i++;
}
fclose(fp);
// 按照学号排序
int j, k;
struct Student temp;
for (j = 0; j < nCount - 1; j++) {
for (k = 0; k < nCount - j - 1; k++) {
// 判断当前两个学生学号的大小关系
switch (strcmp(Student[k].czNumber, Student[k + 1].czNumber)) {
case 1: // 前一个学号大于后一个学号,需要交换
temp = Student[k];
Student[k] = Student[k + 1];
Student[k + 1] = temp;
break;
case 0: // 两个学号相等,不需要交换
case -1: // 前一个学号小于后一个学号,不需要交换
break;
}
}
}
// 打印学生信息
for (i = 0; i < nCount; i++) {
printf("%s %s %s\n", Student[i].czName, Student[i].czNumber, Student[i].guli);
}
return 0;
}
```
在上面的代码中,我们使用了 strcmp 函数来比较两个学号的大小关系,如果前一个学号大于后一个学号,则需要交换这两个学生的位置。最后,使用 for 循环遍历排序后的学生信息并打印出来。
注意,为了简化代码,上面的示例中只实现了按照学号进行排序,如果需要按照其他字段进行排序,可以类似地进行修改。
while (!feof(fp1)) { Student student; fscanf(fp1, "%s %s %s %s %s %f %f %f\n", student.stu_id, student.name, student.sex, student.birthdate, student.phone_num, &student.english, &student.math, &student.total); if (strcmp(student.stu_id, stu_id) == 0) { printf("请输入修改后的信息:\n"); printf("输入学号:"); scanf("%s", &student.stu_id); printf("输入姓名:"); scanf("%s", &student.name); printf("输入性别:"); scanf("%s", &student.sex); printf("输入出生年月:"); scanf("%s", &student.birthdate); printf("输入电话号码:"); scanf("%s", &student.phone_num); printf("输入英语成绩:"); scanf("%f", &student.english); printf("输入数学成绩:"); scanf("%f", &student.math); student.total = student.english + student.math; fprintf(fp2, "%s %s %s %s %s %.2f %.2f %.2f\n", student.stu_id, student.name, student.sex, student.birthdate, student.phone_num, student.english, student.math, student.total); printf("修改成功!\n"); flag = 1; } else { fprintf(fp2, "%s %s %s %s %s %.2f %.2f %.2f\n", student.stu_id, student.name, student.sex, student.birthdate, student.phone_num, student.english, student.math, student.total); } }
这段代码是一个从文件中读取学生信息、修改指定学生信息并将修改后的结果写入到另一个文件中的程序。
程序的执行流程如下:
1. 打开一个名为 fp1 的文件指针,用于读取学生信息。
2. 进入一个 while 循环,判断文件指针是否已经指向文件的末尾。
3. 如果文件指针不在文件末尾,则从文件中读取一条学生信息。
4. 判断当前读取的学生信息是否为要修改的学生信息,如果是则提示用户输入修改后的信息,并将修改后的结果写入到另一个名为 fp2 的文件中。
5. 如果当前读取的学生信息不是要修改的学生信息,则将该学生信息直接写入到 fp2 文件中。
6. 如果在整个文件中都没有找到要修改的学生信息,则输出 "未找到该学生信息!" 的提示信息。
7. 关闭文件指针 fp1 和 fp2。
需要注意的是,这段程序中使用了两个文件指针,其中一个用于读取学生信息,另一个用于将修改后的结果写入到文件中。同时,程序中也使用了结构体来存储学生信息,方便对学生信息进行修改和输出。