71129


ファイルから読み込んだ数値とその数値をソートした結果を出力したいのですが、ソートの結果が出力されません。  
私は以下のようにプログラムをしました。

[code]

    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    const int NMOJI=50;
    const int MAX_ITEM=100;
    
    typedef struct student{
        char name[100];
        double value;
        double weight;
    } Student;
    
    void swap_Student(Student *x, Student *y){
        Student tmp = *x;
        *x = *y;
        *y = tmp;
    }
    
    void sort_by_name(Student a[], int n){
       
        int i, j;
    
        for(i = 0; i < n; i++){
            for(j = n - 1; j > i; j--){
                if(strcmp(a[j - 1].name, a[j].name) > 0) swap_Student(&a[j - 1], &a[j]);
            }
        }
    }
    
    int main()
    {
        FILE *fp;
        Student std[256];
        int i,nitem=0;
        double capacity;
        double weight,value,kati=value/weight;
        char file_name[NMOJI],name[100];
        printf("Data Flie Name: ");
        scanf("%s",file_name);
        if((fp=fopen(file_name,"r"))==NULL){
            printf("%s:そのファイルを開けることはできません。\n",file_name);
            return -1;
        }
        printf("Knapsack capacity: ");  scanf("%lf",&capacity);
        printf("データファイル名： %s\n",file_name);
        printf("ナップサック容量： %f\n",capacity);
       
         fscanf(fp,"%d",&nitem);
        if(nitem>MAX_ITEM){
            printf("アイテム数を%3d以下にしてください.\n",MAX_ITEM);
            return -1;
        } 
        else{
            while(fscanf(fp,"%s%lf%lf",std[nitem].name,&std[nitem].weight,&std[nitem].value)==3){
              printf("%-10s %5.1f %5.1f\n",std[nitem].name,std[nitem].weight,std[nitem].value);  
        }
         sort_by_name(std, nitem);
        while(fscanf(fp,"%s%lf%lf",std[nitem].name,&std[nitem].weight,&std[nitem].value)==3)
            printf("%-10s %5.1f %5.1f\n", std[i].name, std[i].weight, std[i].value);
        }
         fclose(fp);
        return 0;
    }
    
[/code]

<結果>

[code]

    $ ./a.out
    Data Flie Name: knap10.txt
    Knapsack capacity: 121
    データファイル名： knap10.txt
    ナップサック容量： 121.000000
    一番      39.0  42.0
    二番      13.0  12.0
    三番      68.0  45.0
    四番      15.0   5.0
    五番      10.0   2.0
    六番      20.0  61.0
    七番      31.0  89.0
    八番      15.0  32.0
    九番      41.0  47.0
    十番      16.0  18.0
    
[/code]

参考書等参考にしながら実装したので、変なところはないと思うのですが、どの箇所が間違っていますか。  
回答よろしくお願いします。


CC BY-SA 4.0
2020-10-12T06:19:02.873
71125
2020-10-12T07:09:46.507
2020-10-12T06:43:54.657
3060
41837
question
c
ファイルから読み込んだ数値とその数値をソートした結果を出力したいのだが、うまくできない。


「読み込んだデータそのまま」までは表示できていて、「ソート後のデータが表示できていない」のでおかしいのは以下の箇所。

[code]

        else{
            while(fscanf(fp,"%s%lf%lf",std[nitem].name,&std[nitem].weight,&std[nitem].value)==3){
                printf("%-10s %5.1f %5.1f\n",std[nitem].name,std[nitem].weight,std[nitem].value);  
            }
            sort_by_name(std, nitem);
            while(fscanf(fp,"%s%lf%lf",std[nitem].name,&std[nitem].weight,&std[nitem].value)==3)
                printf("%-10s %5.1f %5.1f\n", std[i].name, std[i].weight, std[i].value);
        }
        fclose(fp);
    
[/code]

  * 定義した `sort_by_name` を呼び出した後に、なぜか `fscanf` で再びファイルから読み込もうとしている
  * 一回目の `while + fscanf` で読み込んだ後に `fclose` していないので、(二回目の) ファイルの読み取り開始位置は前回の続き = ファイルの最後から
  * 既に読み取るデータが無いので何も表示されない

ソート後のデータを表示するようにプログラムを修正しましょう。


CC BY-SA 4.0
2020-10-12T07:09:46.507
71129
2020-10-12T07:09:46.507
3060
71125
answer