2017-01-24 5 views
0

私はこの内容でファイルを作成:abcを、私は(別のものを提案しないでください、唯一read()機能付き)読みたい、それがこのプログラムをコンソールに表示する:なぜprintfのデータをread()関数でバッファに格納していないのですか?

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main() 
{ 

    int fd; 
    char buf[3]; 
    int size; 

    fd = open("test",O_RDONLY); 

    for (int i=0;i++;i<3){ 

     size = read(fd,buf,1); // Version 2 used buf+i 
     printf("%c\n", buf[i]); 

    } 

    close(fd); 

    return 0; 
} 

私はバイトを1つずつ取り出すread関数を要求しています。charsは1バイトサイズですが、それはうまくいくでしょう。しかし、実行時にコンソールに何も表示されません。

ヒント?

+2

バイトをオフセットゼロ( 'buf [0]')に読み込むときに、それを超える要素にアクセスしようとするたびに、正しいことが分かりますか? –

+1

あなたの 'read()'コールが* read * anything *の呼び出しを知っていますか?あなたは戻り値を無視しています。ファイルが正常に開かれたかどうかは分かりません。また、 'read()'は 'int'ではなく' ssize_t'を返します。 –

+0

@DavidHoelzerはちょうど編集しました – juRioqs75

答えて

1

お客様のforループ状態は少し反転しています。あなたは、条件の2番目と3番目の部分を交換する必要があります。

for (int i=0;i++;i<3) 

しかし、i++は、最初の反復の間に0に評価され、その条件が偽であるため、ループが入力されることはありません:あなたが持っています。

それはおそらく次のようになります。

for (int i=0; i<3; i++) 

しかし、私はあなたがループ条件を決定(そしておそらくあなたが唯一の3つのバイトを読みたい場合はカウンタを使用)するread()の戻り値を使用することをお勧めしたいです。

1

現在、readbufアレイの最初のエントリを読み込んでいます。 size = read(fd,buf,1);size = read(fd,&buf[i],1);に置き換えてください。

+1

読み込みにはポインタが必要です。&buf [i] –

+0

ありがとう、忘れました - 今編集しました。 – vatsug

2

readを呼び出すと、最初の文字はbufになりますが、その部分は常にbufの部分を印刷するとは限りません。