これまでの回答を要約し、私自身の観察を追加します。
とからの戻り値を確認する必要がopen()
ありread()
ます。それらが失敗した場合、やみくもに続行し、ゴミを印刷することになります。
read()
読み取った文字数を返します。エラーの場合は -1 を返します。バッファをヌルで終了しないためstrlen()
、読み取ったデータの量を見つけるために使用するのは間違っています。
strlen()
反復ごとに再評価するため、ループ テスト条件に呼び出しを配置しないでください。
ステートメント内のbuf[i]
toのキャストは不要です。などの可変引数関数(つまり、 を構成するすべての引数) への追加の引数は、次のようにデフォルトの引数昇格を受けます。int
printf
printf
...
char
s、 s、およびそれらの署名されていない対応するものはsshort
に昇格しますint
float
double
s がsに昇格
キャストがなければ、buf[i]
暗黙のうちにとにかくに昇格されるint
ため、キャストを追加すると、コードを読む人にとってコードがより混乱します。
したがって、コードは次のようになります。
int fd = open("test.txt",O_RDONLY);
if(fd < 0)
{
fprintf(stderr, "open failed: %s\n", strerror(errno));
return;
}
char buf[128];
// It's better to use sizeof(buf) here, so we don't have to change it in case we
// change the size of buf. -1 to leave space for the null terminator
int reader = read(fd,buf,sizeof(buf)-1);
if(reader < 0)
{
fprintf(stderr, "read failed: %s\n", strerror(errno));
close(fd);
return;
}
buf[reader] = 0; // add null terminator for safety
int i;
for (i=0; i < reader; i++)
{
printf("%i: I read: %c", i, buf[i]);
}