

knap10.txtに

[code]

    10
    39.0 13.0 68.0 15.0 10.0 20.0 31.0 15.0 41.0 16.0
    42.0 12.0 45.0  5.0  2.0 61.0 89.0 32.0 47.0 18.0
    
[/code]

と、数字を打ち込んだのですが、その数字が読み込めません。  
ちなみに私は以下のようにプログラムをしました。

[code]

    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    const int NMOJI=50;
    const int MAX_ITEM=100;
    
    int main()
    {
        FILE *fp;
        int i,j;
        int nitem;
        double capacity;
        double weight[MAX_ITEM],value[MAX_ITEM];
        char file_name[NMOJI];
        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); 
        printf("\n");
       
        fscanf(fp,"%d",&nitem);
        if(nitem>MAX_ITEM){
            printf("アイテム数を%3d以下にしてください.\n",MAX_ITEM);
            return -1;
        } 
        for(i=0;i<nitem;i++)
            fscanf(fp,"%lf",&weight[i]);
        for(i=0;i<nitem;i++)
            fscanf(fp,"%lf",&value[i]);
        fclose(fp);
      
        return 0;
    }
    
[/code]

ここで、 `fscanf(fp,"%d",&nitem);` にて、一番上段の10を

[code]

     for(i=0;i<nitem;i++)
            fscanf(fp,"%lf",&weight[i]);
        for(i=0;i<nitem;i++)
            fscanf(fp,"%lf",&value[i]);
    
[/code]

で、上から二段目の重さと、一番下の価値を読み込めると思ったのですが、なぜか実行結果は

[code]

    $ ./a.out
    Data Flie Name: knap10.txt
    Knapsack capacity: 121
    データファイル名： knap10.txt
    ナップサック容量： 121.000000
    
[/code]

としかでてきません。自分は「fscanf」関数は、ファイル内の文字を読み込むものだと思っていたので、どこがおかしいのかがわかりませんでした。なぜ、ファイル内の数字が読み込めないのでしょう。


CC BY-SA 4.0
2020-10-15T02:20:18.293
71205
2020-10-15T04:59:54.087
2020-10-15T02:30:06.497
3475
41837
question
c
ファイル内に記載されている文字が読み込めません


おそらく、ファイル読み込みは成功しているのではないでしょうか。読み込み成功しても何も表示をしていないので、「ナップサック容量」の行で終わるのは正常です。

正常に読み込めたかどうか判定するために、以下のようにコードを修正してはどうでしょうか。

[code]

      if (fscanf(fp, "%d", &nitem) != 1) {
        fprintf(stderr, "アイテム数を読めませんでした\n");
        return EXIT_FAILURE;
      }
      if (nitem > MAX_ITEM) {
        fprintf(stderr, "アイテム数を%3d以下にしてください.\n", MAX_ITEM);
        return EXIT_FAILURE;
      }
      for (i = 0; i < nitem; i++) {
        if (fscanf(fp, "%lf", &weight[i]) != 1) {
          fprintf(stderr, "%d番目の重量の値を読めませんでした.\n", i + 1);
          return EXIT_FAILURE;
        }
      }
      for (i = 0; i < nitem; i++) {
        if (fscanf(fp, "%lf", &value[i])) != 1) {
          fprintf(stderr, "%d番目の価値の値を読めませんでした.\n", i + 1);
          return EXIT_FAILURE;
        }
      }
      fclose(fp);
      printf("%dアイテムの読み込みが完了しました.\n", nitem);
    
[/code]


CC BY-SA 4.0
2020-10-15T04:59:54.087
71211
2020-10-15T04:59:54.087
3475
71205
answer