#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,则会被忽略。)
我在代码中唯一的问题是如何从文件中获取它。我知道如何排序。但我怎么得到它?
答案 0 :(得分:0)
您需要在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);
答案 1 :(得分:0)
使用字符串格式的scanf可能有点棘手,我建议你做这样的事情:
for (int i = 0; i < x; ++i)
{
char buffer[255];
if (fgets(buffer, sizeof(buffer), fptr) != NULL)
{
char *p = strchr(buffer, ' '); // find ' '
if (p!=NULL)
{
*p++ = '\0'; // terminate first string
strncpy(temp[i].name, buffer, MAX); // copy string
temp[i].name[MAX-1] = '\0'; // in case name is too long, truncate
temp[i].score = atoi(p); // get score, whitespace will be ignored
}
}
}