• ベストアンサー

テキストファイルが開けません。

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上で実行しました。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.2

>コンパイル、実行ともに正常終了したのですが、  確かに「正常」終了しました。  正常に「」を付けたのは、   ・オリジナルファイル終端の 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 を指定しなければならない。」とあります。  ここら辺りが影響しているのではないでしょうか。

takau710
質問者

お礼

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

その他の回答 (2)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

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)
回答No.1

>「アクセスは拒否されました。」というダイアログが表示されて >開くことができません。 その書き込み先のファイルは作成可能なのでしょうか? 実行したユーザーでは書き込みできない場所だった…とか。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html errnoには何が設定されていましたか?

関連するQ&A