#include<stdio.h>
#define MAX 255
#define T 100
typedef struct {
char name[MAX];
int score;
} Student;
int main()
{
Student stud, temp[T];
char hnm[T][MAX];
int x,i,hsc,h;
FILE *fptr;
if ((fptr=fopen("scores.dat","a+"))==NULL) {
printf("File Opening was unsuccessful");
}
else {
scanf("%d",&x);
getchar();
for(i=0; i<x; i++) {
scanf("%s %d",&stud.name, &stud.score);
fprintf(fptr,"%s %d\n", stud.name, stud.score);
}
}
fclose(fptr);
if ((fptr=fopen("scores.dat","r"))==NULL) {
printf("File Opening was unsuccessful");
}
else {
i = 0;
temp[i].name = stud.name;
temp[i].score = stud.score;
fscanf(fptr,"%s %d", &stud.name, &stud.score);
while(!feof(fptr)) {
temp[i].name = stud.name;
temp[i].score = stud.score;
fscanf(fptr,"%s %d", &stud.name, &stud.score);
i++;
}
system("pause");
x=sizeof(fptr);
}
fclose(fptr);
for(i=0;i<x-1;i++) {
for(h=0;h<x-i-1;h++) {
if(temp[h].score<temp[h+1].score) {
hsc=temp[h].score;
temp[h].score=temp[h+1].score;
temp[h+1].score=hsc;
hnm[h]=temp[h].name;
temp[h].name=temp[h+1].name;
temp[h+1].name = hnm[h];
}
}
}
for(i=0;i<20;i++){
printf("%s %d\n",temp[i].name1, temp[i].score);
}
if((fptr=fopen("scores.dat","w"))==NULL) {
printf("File Opening was unsuccessful");
}
else {
for(i=0;i<20;i++){
fprintf(fptr,"%s %d\n", temp[i].name, temp[i].score);
printf("Top #%d: %s %d\n",i+1, temp[i].name, temp[i].score);
}
}
fclose(fptr);
return 0;
}
代码很简单,程序会要求用户输入测试用例的数量,并要求输入名称和分数。
输入样例:
4
Name1 100
Name2 900
Name3 800
Name4 150
然后将其放在.Dat文件中。
然后从最高到最低排序。
然后输出前20位(如果数据中的某些得分只有20,因此将被忽略。)
我在代码中唯一的问题是如何从文件中获取它。我知道如何排序。但是我怎么得到呢?
最佳答案
您需要在fcanf
之后使用换行符
您需要使用strcpy
复制学生姓名。
用这个:
i = 0;
fscanf(fptr,"%s %d", &stud.name, &stud.score);
fgetc(fptr);
while(!feof(fptr)) {
strcpy(temp[i].name,stud.name);
temp[i].score = stud.score;
fscanf(fptr,"%s %d", &stud.name, &stud.score);
fgetc(fptr);
i++;
}
system("pause");
x=sizeof(fptr);
关于c - 如何将字符从.Dat文件放入字符字符串持有人编程C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28870708/