- ベストアンサー
テキストファイルが開けません。
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上で実行しました。
- みんなの回答 (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/man2/open.2.html ↑ここの O_CREAT の説明に、「flags に O_CREAT が指定されている場合、 mode を指定しなければならない。」とあります。 ここら辺りが影響しているのではないでしょうか。
その他の回答 (2)
- yama5140
- ベストアンサー率54% (136/250)
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 を指定したことで、 申し訳ない・・。
- Wr5
- ベストアンサー率53% (2173/4061)
>「アクセスは拒否されました。」というダイアログが表示されて >開くことができません。 その書き込み先のファイルは作成可能なのでしょうか? 実行したユーザーでは書き込みできない場所だった…とか。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html errnoには何が設定されていましたか?
お礼
回答ありがとうございます。 ls -lで確認してみたら、 yama5140さんの言うとおり、 作られたファイルが読み込み・書き込み禁止になっていました。 解決できてよかったです。