readline()
関数が割り当てられたメモリへのポインターを返していません。あなたの呼び出しでcurrent
は、設定されていないため、ポインターが無効になり、エラーが発生します。
C では、関数は「値による呼び出し」です。内部readline()
にbufPtr
は、渡されたもののコピーがありますreadline()
。への代入bufPtr
は、ローカル コピーを上書きするだけで、呼び出し元のコードが認識できる値を返しません。
擬似コード:
TYPE a;
define function foo(TYPE x)
{
x = new_value;
}
foo(a); // does not change a
これは のローカル コピーを変更するだけでx
、値を返しません。ポインターを使用するように変更します...関数は引き続きコピーを取得しますが、ポインターのコピーになり、そのポインター値を使用して元の変数を見つけることができます。擬似コード:
TYPE a;
define function foo(TYPE *px)
{
*px = new_value;
}
foo(&a); // does change a
ここで、関数を変更するには:
ssize_t
readline(FILE *file, char **pbufPtr, size_t *len)
{
// ...deleted...
buf[n] = '\0';
*pbufPtr = buf;
// ...deleted...
}
そして、あなたはそれを次のように呼びます:
while(readline(passFile, ¤t, &len) != -1)
PSここで行う方法を呼び出すrealloc()
のは良い考えではありません。これは非常に遅い関数である可能性があり、65 文字の入力文字列の場合、65 回呼び出すことになります。最初のファイル入力に内部バッファーを使用し、次に使用malloc()
して適切なサイズの文字列を割り当て、その文字列をバッファーにコピーすることをお勧めします。文字列が長すぎて一度に内部バッファーに収まらない場合は、 を使用malloc()
して、内部バッファーにある文字列の一部をコピーするのに十分な大きさの場所を取得してから、内部バッファーを使用してさらに多くの文字列をコピーします。 、必要に応じて呼び出しrealloc()
ます。基本的に、サイズ N の内部バッファを用意し、文字列を一度に N 文字のチャンクでコピーして、呼び出しの数を最小限に抑えることをお勧めします。realloc()
任意の長さの入力文字列を引き続き許可します。
編集:最後の行の問題は、返す行があるにもかかわらず、ファイルの終わりに到達したときに -1 を返すことです。
c == EOF
と の場合にのみ -1 を返すようにコードを変更してn == 0
、EOF で終わる最終行が正しく返されるようにします。
また、関数をreadline()
使用してがファイルの終わりにあるかどうかを確認し、そうであれば、を呼び出さずに -1 を返す必要があります。feof()
file
malloc()
基本的に、-1 を返すときに を呼び出したくありませんmalloc()
。また、呼び出しmalloc()
てデータをコピーしたときに、-1 を返したくありません! -1 は、「ファイルの終わりに達したため、何も得られなかった」ことを意味するはずです。ファイルの終わりに到達する前に何かを取得した場合、それは -1 ではなく、0 です。その後の次の呼び出しreadline()
は -1 を返します。