2017-09-19 14 views
-1
char *arr[512][lineCount]; 
while(lineCount > 0){  
    char *savedLine = malloc(512); 
    while(1){ 
    fread(savedLine, 1, 1,fd); 
    if(savedLine != '\n'){ 
     arr = savedLine; 
    }else{ 
     break; 
    } 
    }lineCount --; 
} 

文字を1行ずつ格納する2Dのchar配列を作成しようとしています。 私はfgetsを使用することができませんので、freadを使用して、一度に1つの文字を格納して、'\n'に達するまでしました。しかし、ポインタと整数(savedLine != 'n')を比較できず、配列型が代入不可(char *arr[512][lineCount])であると言ってコンパイルされません。残りの変数は私のコードで宣言されています。freadを使用してcharを2次元配列に保存するにはどうすればよいですか?

+0

これらの寸法は特に乱雑に見えます。 charへのポインタの配列の配列であってはなりません。何かあれば、charへのポインタのVLAでなければなりません。つまり、char * arr [512] [lineCount];を 'char * arr [lineCount];'に変更することから始めます。また、あなたのリストを作成している間に、 'arr'のインデックスにゼロから始まる昇順のカウンターがあります。最後に、[fgets](http://en.cppreference.com/w/c/io/fgets)はおそらく、1行ごとの作業に適しています。 – WhozCraig

+0

コンパイラの警告を有効にしてください。 'savedLine!= '\ n''は他のものと同様に警告する必要があります:文字定数へのポインタの比較。 – chux

答えて

1

文字の2D配列を持たず、ポインタの2D配列があり、これらのポインタには何も割り当てません。しかし、ポインタはまったく必要ありません。変数charを宣言し、そのアドレスを読み込んで配列にコピーしてください。

char arr[lineCount][512]; 
int pos = 0; 
while (lineCount > 0) { 
    char tempChar; 
    size_t n = fread(&tempChar, 1, 1, fd); 
    if (n == 0) { // EOF or error 
     break; 
    } 
    if (tempChar == '\n') { 
     arr[lineCount-1][pos] = '\0'; // Add trailing null to current line 
     lineCount--; // Start new line 
     pos = 0; 
    } else { 
     arr[lineCount-1][pos] = tempChar; 
     pos++; 
     if (pos == 511) { // Filled up current line, start new line 
      arr[lineCount-1][pos] = '\0'; 
      lineCount--; 
      pos = 0; 
     } 
    } 
} 

アレイは0からsize-1に索引付けされているので、あなたが、アレイに割り当てるときlineCountから1を減算する必要があることに注意してください。また、配列の宣言が後方にあることに注意してください。

+0

各 'arr []'の使用量は記録されません。 end-if-line、EOFに ''0 \ 'をつけたのでしょうか? – chux

+0

ありがとうございます! – geronimo

+0

@chuxありがとう、それを修正しました。 – Barmar

関連する問題