0

私はCを学び、テキストファイルから整数を読み取って配列に格納する小さなプログラムを書くことで練習しています。ただし、整数が何らかの形で格納されることはなく、配列は空です。

 int readNumbers(int array[], char* fname) {                                                                                                                                                                                               
 78                                                                                                                                                                      
 79                                                                                                                                                                                             
 80     int numberRead = 0;                                                                                                                                                                                                                   
 81     FILE* fp;                                                                                                                                                                                                                             
 82     int ch;                                                                                                                                                                                                                               
 83     int i = 0;                                                                                                                                                                                                                            
 84                                                                                                                                                                                                                                           
 85                                                                                                                                                                                          
 86                                                                                                                                                                                                                                  
 87     fp = fopen(fname, "r");                                                                                                                                                                                                               
 88     // Test to see if the file was opened correctly                                                                                                                                                                                       
 89                                                                                                                                                                                                                                   
 90     if (fp == NULL) {                                                                                                                                                                                                                     
 91             printf("Error opening file\n");                                                                                                                                                                                               
 92             return;                                                                                                                                                                                                                       
 93     }                                                                                                                                                                                                                                     
 94     // Now read until end of file                                                                                                                                                                                                         
 95                                                                                                                                                                                                                                  
 96     while (ch = fgetc(fp) != EOF && isdigit(ch)) {                                                                                                                                                                                        
 97             array[i++] = ch;                                                                                                                                                                                                              
 98     }                                                                                                                                                                                                                                     
 99     if (ferror(fp)) {                                                                                                                                                                                                                     
100             return;                                                                                                                                                                                                                       
101     }                                                                                                                                                                                                                                     
102     // Close the file pointer                                                                                                                                                                                                             
103                                                                                                                                                                                                                                 
104     fclose(fp);                                                                                                                                                                                                                           
105                                                                                                                                                                                                                                           
106     // Return the number of items read                                                                                                                                                                                                    
107     return numberRead;                                                                                                                                                                          
108 }

テキストファイルは次のようになります。

1 2 3 4 5 6 7 8 9

前もって感謝します。

コードを更新しました。これはほとんど機能しますが、 や などの文字を解釈555ます5。したがって、私の配列には 2 つ5の があります。

 while ((ch =fgetc(fp)) != EOF) {                                                                                                                                                                                                      
 97             if (ch != ' ' && ch != '\n') {                                                                                                                                                                                                
 98                     array[counter] = ch - '0';                                                                                                                                                                                            
 99                     counter++;                                                                                                                                                                                                            
100                     numberRead++;                                                                                                                                                                                                         
101             }                                                                                                                                                                                                                             
102     }
4

3 に答える 3

1

ここで括弧while (ch = fgetc(fp) != EOF && isdigit(ch))を使用する必要があります。それ以外の場合は、 1 または 0 (TRUE または FALSE)の値をwhile ((ch = fgetc(fp)) != EOF && isdigit(ch))格納します。chfgetc(fp) != EOF

于 2014-10-07T01:34:50.817 に答える
1

returnMatt McNabb がコメントで述べたことを拡張するには、(関数内にない限り) 値なしでは使用できませんvoidreadNumbers()関数は return と宣言されているintため、すべてのreturn パスは int を返す必要があります。0 は (一種の :) ) 読み取る有効な文字数であるため、ファイル エラーがある場合は -1 を返すことができます。

while入力ファイルの数字の間にスペースがあるため、ループ内のロジックを変更する必要があります。

while ((ch = fgetc(fp)) != EOF && isdigit(ch))

数字以外の文字を読み取るとすぐに失敗します。

また、読み取った各文字の数値を配列に格納していることにも言及する必要がありますが、これはあなたが望むものではないかもしれません。たとえば、ASCII では、'0' 文字は 48 の数値を持ち、'1' は 49 の値を持ちます。

PS。readNumbers()呼び出す関数が、可能な結果を​​処理するのに十分な大きさの配列を提供することを確認してください...


exit()実用的な場合は、プログラムの奥深くで使用することを避け、 でのみ使用してmain()ください。また、単にプログラムストーンを強制終了するよりも、まず何らかのエラーメッセージを (通常は stderr に) 出力してから、適切に終了する方がはるかに優れexit()ます。適切なエラー メッセージの作成については、関数を調べて、 を参照してください。<stdio.h>perror()<errno.h>

エラー メッセージを出力しreadNumbers()て -1 を返すか、呼び出し元の関数 (例: main()) に、プログラムが終了するほどエラーがひどいかどうかを判断させることができます。または、呼び出し元の関数にエラー メッセージの出力も処理させます。

于 2014-10-07T01:48:07.830 に答える