限定しりとり

main関数に2つの引数をとり、第1引数で指定したファイルの内容を第2引数で指定したファイルにコピーするプログラムを以下のように作りました。
#include<stdio.h>
#include<fcntl.h>
int main(int argc, char* argv[]){
int fd1, fd2, rs, ws;
char buffer[10000];
if(argc!=3){
write(2, "使用法:実行ファイル コピー元ファイル コピー先ファイル\n", 54);
exit(1);
}
fd1=open(argv[1], O_RDONLY);
if(fd1<0){
fprintf(stderr, "can't open file '%s'.\n", argv[1]);
exit(1);
}
fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC);
if(fd2<0){
fprintf(stderr, "can't open file '%s'.\n", argv[2]);
exit(1);
}
while((rs=read(fd1, buffer, 10000))>0){
if((ws=write(fd2, buffer, rs))!=rs){
write(2, "an error occurred while copying.\n");
exit(1);
}
}
close(fd1);
close(fd2);
}
コンパイル、実行ともに正常終了したのですが、
コピー先のテキストファイルを開こうとすると、
「アクセスは拒否されました。」というダイアログが表示されて
開くことができません。
なぜなのでしょうか。
よろしくお願いします。
ちなみにOSはWindows Vistaで、
プログラムはcygwin上で実行しました。

A 回答 (3件)

>コンパイル、実行ともに正常終了したのですが、



 確かに「正常」終了しました。

 正常に「」を付けたのは、

  ・オリジナルファイル終端の 0x1A が、新規のものには無い(1バイト小さい)。
  ・新規のファイルは、属性が「書き込み禁止」でできあがった。

 からです(前者は些末のことと思います)。

>コピー先のテキストファイルを開こうとすると、
>「アクセスは拒否されました。」というダイアログが表示されて
>開くことができません。

 windows2000 では、アクセスできました。

 fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); このうち、O_TRUNC を指定したことで、
 open() に「第3引数」が必要となるようです。

 http://www.linux.or.jp/JM/html/LDP_man-pages/man …

 ↑ここの O_CREAT の説明に、「flags に O_CREAT が指定されている場合、 mode を指定しなければならない。」とあります。

 ここら辺りが影響しているのではないでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ls -lで確認してみたら、
yama5140さんの言うとおり、
作られたファイルが読み込み・書き込み禁止になっていました。
解決できてよかったです。

お礼日時:2009/06/26 01:00

No.2 です。



訂正
誤:fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); このうち、O_TRUNC を指定したことで、
正:fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); このうち、O_CREAT を指定したことで、

申し訳ない・・。
    • good
    • 0

>「アクセスは拒否されました。

」というダイアログが表示されて
>開くことができません。

その書き込み先のファイルは作成可能なのでしょうか?
実行したユーザーでは書き込みできない場所だった…とか。


http://www.linux.or.jp/JM/html/LDP_man-pages/man …
errnoには何が設定されていましたか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!