如何将.Dat文件中的char放到char字符串持有者编程c

时间:2015-03-05 05:31:13

标签: c

#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,则会被忽略。)

我在代码中唯一的问题是如何从文件中获取它。我知道如何排序。但我怎么得到它?

2 个答案:

答案 0 :(得分:0)

  1. 您需要在fcanf

  2. 之后使用换行符
  3. 您需要使用strcpy复制学生姓名。

  4. 使用此:

            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
    }
  }
}