2012-04-23 18 views
2

1つの長い文字列を含むファイルを読み込み、これを文字列の配列に読み込むという小さな練習をしています。これまでのところ私が持っている:私はfgetsの問題をC++で持っています

char* data[11]; 
char buf[15]; 
int i = 0; 

FILE* indata; 
indata = fopen("somefile.txt", "r"); 
while(i < 11) 
{ 
    fgets(buf, 16, indata); 
    data[i] = buf; 
    i++; 
} 

fclose(indata); 

somefile.txt:「aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbaahhhhhbbbbdddddddddddddbbbbb」

などを...

これは問題を、15個の文字を読み込み配列にその文字列を追加し、次の15を取得します配列は常に最後の文字列と等しいので、最後の文字列が "ccccv"であれば、配列全体[data] = "ccccv"、data [1] = "ccccv"、data [2] = "ccccv"に。

なぜこのようなことが起こっているのか、それを行うためのより良い方法があるかどうかを知っていますか?ありがとう

答えて

2

dataの各ポインタは、同じメモリ領域(buf)を指します。 strcpy + mallocを使用する必要があります。

また、「マイナー」バッファオーバーフローがあるようです。 bufのサイズは15で、16文字を読んでいます。

+0

データはポインタの配列なので、 'malloc' +' strcpy'または 'strdup'を使うべきです。 – mfontanini

+0

strcpyは後ろに\ 0がなければ動作しません。少なくともstrncpyを使用する必要があります。最高でmemcpy。 – ypnos

+0

right ...私はそれを逃した – mihai

関連する問題