2017-12-19 11 views
0

私はいくつかのファイルを繰り返し処理し、各行の情報を動的に割り当てられた文字列配列に入れようとしています。私はこのような配列を割り当てました:ファイルの繰り返しと文字列への情報の追加 - C

followerArr = malloc(sizeof(char *) * (followerCount + 1)); 
for (i = 0; i < followerCount; i++) 
    followerArr[i] = malloc(sizeof(char) * 15); 

これは完全にうまくいくようです。その後、ファイルの最後までファイルを調べ、ユーザーの名前を文字列配列に入れたいと考えました。

if (followerCount > 0) { 
    fp3 = fopen(followerFile, "r"); 
    if (fp3 == NULL) 
     printf("Error opening file\n"); 
    else { 
     char line[1000]; 
     while (fgets(line, sizeof(line), fp3) != NULL) { 
      if (i > 0) 
       followerArr[i - 1] = line; 
      i++; 
     } 
     fclose(fp3); 
    } 
} 

I:

最初の番号は、ファイル内のユーザー数が、この場合には、
4 
user1 
user2 
user3 
user4 

4.ファイルスキャンのための私のコードはこれです:ファイルの1つは、このように見えましたまた、whileループでprint文を行なったし、それが

user1 
user2 
user3 
user4 

を印刷します。すなわち、それは、通常のプリントアウトしかし、whileループの後、ファイルを閉じて、それはすべての4倍USER4出力します。配列が基本的にそれがwhileループに入ってから外に出てから変化しているのはなぜですか?

+2

文字列を解放する必要があるとして、[I - 1] = line'。基本的には、すべての配列要素に同じデータをコピーしています。ループの*行を*代入後に(そして配列から)出力すると、それを見ることができます。 – usr2564301

+0

それは、whileループでは動作するが、afterループでは機能しないので、意味をなさないでしょう。データがアレイに正しく書き込まれるように、どうすれば修正できますか? – bmw417

+2

メモリが漏れています。 'followerArr [i]'に割り当てられたメモリを割り当てた後、その値を上書きします。代わりに 'strncpy'を使用してください – MFisherKDX

答えて

0

ファイルを1行ずつ読み込む別の例を示しますが、現在のコードでは役に立ちます。

char* line; 
ssize_t len; 
char** dest = malloc (sizeof(char*) * 15) 
size_t read = 0; 
while ((read = getline(&line, &len, fp)) != -1) { 
    line[strlen(line) - 1] = '\0'; // Remove the newline 
    dest[i] = malloc (strlen(line)); 
    strcpy(dest[i], line); 
} 

は、その後、あなたはあなたの割り当て `followerArrをサポートしていない各要素と配列全体Cで

関連する問題