2017-11-07 2 views
0

私はmalファイルを読み込むプログラムを作成しており、出力ファイルに出力することになっています。しかし、私が抱えている問題の1つは、最初のwhileループで、ファイルから各行のアドレスをlineRef [i]に格納するときです。whileループでは、すぐに印刷すると印刷されます正しい行。しかし、2回目のwhileループでは、ファイルの最後の行が表示されます。ここで文字添字ごとにファイルの最後の行を格納するポインタの配列

FILE * inputFile = fopen("example.mal", "r"); 
FILE * outputFile = fopen("output.lst", "w"); 

char linesFromFile[256]; 
char * lineRef[50]; 
char * labels[50]; 

int i = 0; 
while(fgets(linesFromFile, 256, inputFile) != NULL) 
{ 
    lineRef[i] = linesFromFile; 
    i++; 
} 

i = 0; 
while(lineRef[i] != NULL) 
{ 
    printf("%s\n", lineRef[i]); 
    i++; 
} 
return 0; 

答えて

0
lineRef[i] = linesFromFile; 

あなたが行ごとにメモリを割り当てる必要がlineRef のすべての要素にlinesFromFileの同じアドレスを割り当てている、それにlinesFromFileの内容をコピーlineRefの各要素に読み込ま。申し訳ありません

例えば

while(fgets(linesFromFile, 256, inputFile) != NULL) 
{ 
    lineRef[i] = malloc(256); 
    memset(lineRef[i],'\0',256); 
    strncpy(lineRef[i] , linesFromFile,256); 
    i++; 
} 
+0

あなたは行ごとにメモリを割り当てることにより、何を意味するのですか?私はどのようにメモリを割り当てるのか知っていますが、私はどのように各行に割り当てるのか分かりません。 – Stuy

+0

@Stuy例文 – Pras

+0

'char * lineRef [50];を使って答えを更新しました。char [50個] *へのポインタの配列を作成します。ポインタは初期化されておらず、どこにも指していません。それらがどこか意味のある場所(行を保存できる場所)を指すようにするには、メモリブロックを割り当て、そのブロックの開始アドレスをポインタの1つに割り当てる必要があります。その行をそのメモリブロックにコピーします。あなたは各行ごとにそれを行います。 (ブロックしたら、各ブロックをフリーズする必要があります) –

関連する問題