2011-12-27 24 views
2

テキストファイルをプレーンCの1次元配列に読み込む方法はありますか?私が試みたものは次のとおりです(私はハングマンを書いています):テキストファイルをプレーンCの配列に読み込む

int main() { 
    printf("Welcome to hangman!"); 

    char buffer[81]; 
    FILE *dictionary; 
    int random_num; 
    int i; 
    char word_array[80368]; 

    srand (time(NULL)); 

    random_num = rand() % 80368 + 1; 
    dictionary = fopen("dictionary.txt", "r"); 

    while (fgets(buffer, 80, dictionary) != NULL){ 
     printf(buffer); //just to make sure the code worked; 
     for (i = 1; i < 80368; i++) { 
      word_array[i] = *buffer; 
     } 
    } 

    printf("%s, \n", word_array[random_num]); 
    return 0; 
} 

何が間違っていますか?

+1

Word_arrayは、charではなくchar *の配列である必要があります。バッファを動的に割り当てる必要があります(単一のバッファは各fgetsに上書きされ、word_arrayの割り当てはすべて同じになります)。 – mpez0

答えて

3

は、物事のカップルを変更してみてくださいを。

まず、あなたは1つの文字を格納しています。 word_array[i] = *buffer;は、word_arrayの各(およびすべての)単一文字スロットに単一の文字(行の最初のもの/バッファ内のもの)をコピーすることを意味します。

第2に、配列に80K文字ではなく80K文字が格納されます。それがあなたの辞書ファイルの長さであると仮定すると、そのループを使ってそこにすべてを収めることはできません。

あなたの辞書ファイルに80,368語があるとします。それはあなたが意図的に一次元配列をしたい場合は、何らかの理由で、あなたはのいずれかを実行する必要がありますけれども、私のワークステーション上/usr/share/dict/wordsより40万の言葉より少ないですが、絞首刑執行人のための合理的なサイズのように聞こえる...

三つのこと:各リチウムの先頭にインデックスを持つ並列アレイを作成

char word_array[80368 * 80]; 

memcpy (&(word_array[80 * i]), buffer, 80); 
    • あなたは、メインフレームにしているふりをし、すべての単語のための80個の文字を使用します、スロットごとに一つの単語をchar型へのポインタの配列を使用することに大きなバッファ

      int last_char = 0; 
          char* word_start[80368]; 
          char word_array[80368 * 80]; 
          for (… i++) { 
           memcpy (&word_array[last_char], buffer, strlen(buffer)); 
           word_start[i] = last_char; 
           last_char += strlen(buffer); 
          } 
      
    • スイッチでNE。

      char* word_array[80368]; 
      
          for (int i = 0; i < 80368, i++) { 
           fgets (buffer, 80, dictionary); 
           word_array[i] = strdup (buffer); 
          } 
      

    そうしないと、最大サイズを推測または読み込み中にRAMの多くを無駄に持っているように私は、後者をお勧めします。 (あなたの平均単語長は、英語のように、周りの4-5文字である場合は、平均的な消耗ワード当たり75バイトにしている。)

    私もword_arrayに割り当てる動的にお勧めしたい:

    int max_word = 80368; 
        char** word_array = malloc (max_word * sizeof (char*)); 
    

    を...あなたの辞書サイズがこれまでに変更した場合に、より安全な読み取りにあなたを導くことができます。

    int i = 0; 
        while (1) { 
         /* If we've exceeded the preset word list size, increase it. */ 
         if (i > max_word) { 
          max_word *= 1.2; /* tunable arbitrary value */ 
          word_array = realloc (word_array, max_word * sizeof(char*)); 
         } 
         /* Try to read a line, and… */ 
         char* e = fgets (buffer, 80, dictionary); 
         if (NULL == e) { /* end of file */ 
          /* free any unused space */ 
          word_array = realloc (word_array, i * sizeof(char*)); 
          /* exit the otherwise-infinite loop */ 
          break; 
         } else { 
          /* remove any \r and/or \n end-of-line chars */ 
          for (char *s = &(buffer[0]); s < &(buffer[80]); ++s) { 
           if ('\r' == *s || '\n' == *s || '\0' == *s) { 
            *s = '\0'; break; 
           } 
          } 
          /* store a copy of the word, only, and increment the counter. 
          * Note that `strdup` will only copy up to the end-of-string \0, 
          * so you will only allocate enough memory for actual word 
          * lengths, terminal \0's, and the array of pointers itself. */ 
          *(word_array + i++) = strdup (buffer); 
         } 
        } 
        /* when we reach here, word_array is guaranteed to be the right size */ 
        random = rand() % max_word; 
        printf ("random word #%d: %s\n", random, *(word_array + random)); 
    

    申し訳ありませんが、これは急いで掲示されるので、私は上記をテストしていません。買い手責任負担。

  • 3

    この部分は間違っている:サイズ81変更し、それに持っているあなたはbufferから80368個の文字をコピーしている

    while (fgets(buffer, 80, dictionary) != NULL){ 
        printf(buffer); //just to make sure the code worked; 
        for (i = 1; i < 80368; i++) { 
         word_array[i] = *buffer; 
        } 
    } 
    

    i = 0; 
    while (fgets(buffer, 80, dictionary) != NULL){ 
        printf(buffer); //just to make sure the code worked; 
        for (j = 0; j < 80; j++) { 
         word_array[i++] = buffer[j]; 
        } 
    } 
    
    +0

    fyi、1行目のセミコロンを忘れました;-) –

    +0

    word_array [i ++] = '\ 0'; –

    +0

    その行は何をしていますか? –

    関連する問題