2012-02-09 13 views
1

ファイルの内容を取得して出力ファイルに転記するクイックプログラムを作成しました。初めて私のプログラムを実行するときにエラーはなく、すべてがうまくいくかのように見えます。しかし、出力ファイルをチェックするとファイルに何もありません。私の最初の考えは、パーミッションが正しくなく、書き込みが許可されていないということでした。私は手動でディレクトリに.txtファイルを作成し、権限を設定し、それが動作するように見えるプログラムを実行したとき(ubuntuは私にファイルの内容を表示しています)、実際のファイルを開くことはできません。 自分よりも経験豊富な人であれを助けてくれることを願っています。さてここで は私のコードです:read()、write()、open()を使ってファイルの内容を別のものにコピーする

int main(int argc, char* argv[]){ 
    char buf[128]; 
    int outft, inft,fileread; 
    // output file opened or created 
    if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR))==-1){ 
    perror("open"); 
    } 
    // lets open the input file 
    inft = open(argv[2], O_RDONLY); 
    if(inft >0){ // there are things to read from the input 
    fileread = read(inft, buf, 160); 
    printf("%s\n", buf); 
    write(outft, buf, 160); 
    close(inft); 
    } 
    close(outft); 
    return 0; 
} 
+2

あなたは128バイトバッファに160のバイトを読んでいますか? –

+0

入力ファイルのオープンに失敗した場合、それは報告されません。 'read()'と 'write()'の戻り値もチェックされません。 – hmjd

+0

@ paulsm4は権限に関しても同様です。また、 'open()'で 'O_CREAT'を使うときに必要です。バッファオーバーランが修正された状態でこのコードを実行すると、新しいファイルのファイルパーミッションに対してランダムなガベージが発生します。 – Dmitri

答えて

2

あなたのデータバッファのサイズは128バイトですが、あなたはそれへのデータの160のバイトを読んでいます。これは、宣言されたバッファの外側のメモリに書き込むことを意味します。

outft, inft, and filereadはおそらくメモリ内でbufに続き、read()コール中にゴミで上書きされると思います。 write()への呼び出しは、書き込み対象のファイル記述子のガベージ値を取得しているため、おそらく失敗しています。バッファオーバーフローを回避するために

sizeofはあなたの友達です:

fileread = read(inft, buf, sizeof(buf)); 
... 
write(outft, buf, fileread); 
+0

ええ、それを理解し、これが間違いだった方法を実現しました。 –

3

も、ファイルのアクセス権を設定してください。

例:

if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666))==-1){ 
    perror("open"); 
    } 
関連する問題