/* Utility function to read lines of unknown lengths */
char *readline(FILE* fp, int max_length)
{
//The size is extended by the input with the value of the provisional
char *str;
int ch;
int len = 0;
int current_max = max_length;
str = (char*)malloc(sizeof(char)*current_max);
if(!str)
return str;
while((char)(ch = fgetc(fp))!='\n' && ch != EOF)
{
str[len++] = ch;
if(len == current_max)
{
current_max = current_max + max_length;
str = realloc(str, sizeof(char)*current_max);
if(!str)
return str;
}
}
str[len] = '\0';
return str;
}
私は未知の長さの行を読み取るために上記のコードスニペットを持っています。私はstdinから期待されるように、単一行の入力を読むことができますが、ファイルを読んでいる間にファイルのEOFを決定するのに問題があります。不明な行の長さのファイルを読み取っているときにEOFを確認する
ファイルから読み込んでいるときに、私はそれをループで1行ずつ読み込んでいますが、今度はすべての行が読み込まれたらループを中断したいのですが、いつ実行するのか判断できません。永遠に実行を終了します。休憩状態を判断するのに手伝ってください。
char *line;
while(1)
{
line = readline(fd, MAX_INPUT_LENGTH);
/*IF all lines have been read then break off the loop, basically determine EOF ?*
//text processing on the line
}
[malloc()の戻り値と 'C 'のファミリをキャストしない理由についてのこの記事を参照してください。](http://stackoverflow.com/q/605845/2173917)。 –
問題は、ファイルの終わりに到達したことを関数が呼び出し側にどのように伝えることができるのかわからないことです。文字が正常に読み取られる前にEOFが検出された場合は、NULLを戻すことを検討してください。 –
'while'のキャストは不要です(' '\ n''は 'int'です)。私は通常、どちらの命令も動作しますが、while((ch = fgetc(fp))!= EOF && ch!= '\ n')を使用します。 –