• ベストアンサー

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

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% (2177/4070)
回答No.1

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

関連するQ&A

  • C言語の質問です

    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } このプログラムをグレースケール化のプログラムに修正してください お願いします

  • ファイル操作

    コマンドライン引数から、データを入力し、入力データ中の数字を'*'文字で置き換え、それ以外の文字をそのまま出力させるプログラムを作るため #include<stdio.h> int main(int argc, char *argv[]){ FILE *fpi,fpo; char ch; if(argc!=3) { fprintf(stderr, "Illegal number of argument.\n"); return(-1); } if((fpi=fopen(argv[1],"r"))==NULL) { fprintf(stderr, "Can't open input file <%s>.\n", argv[1]); return(-1); } if((fpo=fopen(argv[2],"w"))==NULL){ fprintf(stderr, "Can't open output file <%s>.\n", argv[2]); return(-1); } while((ch=fgetc(fpi))!=EOF){ if(ch>=0 && ch<=9){ ch='*'; } } fclose(fpi); fclose(fpo); return 0; } のようなプログラムを書いたのですが、 if((fpo=fopen(argv[2],"w"))==NULL)がimcompitable types in assigment fclose(fpo);がimcompitable types for arguments1 of 'fclose' というようなエラーが出ます。 なぜか教えていただけませんか? また、その他、足りないところがあれば教えていただけませんか?

  • pgm画像入出力(C言語)

    画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは2倍に変換していますが、そこは重要ではなく、入出力さえできればいいです。 OS:windows 文字コード:色々試したけどダメ。試してないものもあるかも。 プログラム #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } コンパイル方法(cygwin) ./a 入力画像.pgm 出力画像.pgm

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • c言語で任意のファイルから読み込んだ単語の数をカウントする

    c言語で任意のファイルから読み込んだ単語の数をカウントする 任意のファイルを読み込んだプログラムに、読み込んだ単語の数をカウントするプログラムを追加する課題が出ました。 条件は単語は空白で区切って1単語とする。改行も考慮に入れる。 関数を定義してポインタを使うらしいのですが検討がつきません。 下のプログラムでファイルを読み込むところまでは出来ています。 どうかご教授おねがいします;; #include <stdio.h> int main(int argc, char *argv[]) { FILE *myFile; int i=0,c; if(argc < 2) { fprintf(stderr,"alice.txt is required\n"); return 1; } myFile=fopen(argv[1],"r"); if(myFile==NULL) { fprintf(stderr,"Cannot open; %s\n",argv[1]); } while ((c=fgetc(myFile)) !=EOF) { fprintf(stderr,"%c",c); } fclose(myFile); return 0; }

  • 次の問題の解答をお願いします。

    次の問題の解答をお願いします。 次のプログラムには問題があり、コピー先ファイルへ書き込んでいる途中にエラーが発生した場合を想定していない。エラーが発生した場合にメッセージを表示してすぐに終了するようにプログラムを修正せよ。また各行の説明もせよ。 #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> int main(int argc, char*argv[]) { FILE*source_fp,*dest_fp; int ch; if(argc!=3){ fprintf(stderr,"使い方: %s original.txt copy.txt\n",argv[0]); exit(EXIT_FAILURE); } if((source_fp=fopen(argv[1],"rb"))==NULL){ fprintf(stderr,"%s failed: %s\n", argv[1],strerror(errno)); exit(EXIT_FAILURE); } if((dest_fp_fp=fopen(argv[2],"wb"))==NULL){ fprintf(stderr,"%s failed: %s\n",argv[2],strerror(errno)); exit(EXIT_FAILURE); } while ((ch=getc(source_fp))!=EOF){ putc(ch,dest_fp); } fclose(source_fp); fclose(dest_fp); return 0; エラーメッセージを表示するにはどうしたらいいのかよくわかりません。 よろしくお願いします。

  • C言語 エラーチェックについて

    初めまして。分からないところがあったので質問させていただきます。 以下のプログラムは引数から値を取得し、その値で生データの切り出しを 行うプログラムです。 read関数のところなのですが、argv[1]に格納されたファイル(パス名)が0byteでもエラーが出力されずに、コンパイルされてしまいます。 どうすればよいのでしょうか? さらに、上司にreadとwriteにエラーチェックのメッセージをつけろ。と言われたのですが、どうやれば良いのかよく分かりませんでした。if()~とすれば良いのでしょうか?初心者なので分かりにくい質問かと思いますが、どうぞよろしくお願いします。 #pragma warning ( disable : 4996 ) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <sys/stat.h> #define ONESEGSIZE 2048 void main ( argc, argv ) int argc; char *argv[]; { int fd, fd2; // ファイルハンドル int segment; // 列数 int raw_n; // 切り出す生データの数 int tviews; // 総ビュー数 int start_view; // 切り出し開始ビュー int size_view; // 切り出しサイズ int pitch_view; // 切り出しピッチ char *Rawdivit; // コマンド char *raw_file; // 生データファイル名 char *outraw_file; // 生データ出力ファイル名 char *mem; // メモリ変数 /* パラメータの個数チェック */ if ( argc != 9 ) { printf( "usage : Rawdivit raw_file outraw_file segment raw_n" " tviews start_view size_view pitch_view \n" ); exit ( 1 ); } /* 引数の取得char型 */ Rawdivit = argv[0]; raw_file = argv[1]; outraw_file = argv[2]; /* 引数の取得int型 */ segment = atoi ( argv[3] ); raw_n = atoi ( argv[4] ); tviews = atoi ( argv[5] ); start_view = atoi ( argv[6] ); size_view = atoi ( argv[7] ); pitch_view = atoi ( argv[8] ); /* 生データファイルオープン */ fd = open ( raw_file, O_RDONLY | O_BINARY ); if ( fd == -1 ) { printf ( "Fileopen error : read\n" ); exit ( -1 ); } /* 生データ読み込み用メモリ確保 */ mem = ( char * ) malloc ( ONESEGSIZE * segment * size_view ); // 単位 = byte if ( mem == NULL ) { printf ( "Memorysecure error\n" ); exit ( -1 ); } /* 切り出し開始位置までファイルポインタをシーク */ lseek ( fd, ONESEGSIZE * segment * start_view, SEEK_SET ); /* 切り出しサイズ分読み込み */ read ( fd, mem, ONESEGSIZE * segment * size_view ); /* 出力ファイルオープン */ fd2 = open ( outraw_file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE ); if ( fd2 == -1 ) { printf ( "Fileopen error : write\n" ); exit ( -1 ); } /* 読み込んだデータを出力ファイルに書き込み */ write ( fd2, mem, ONESEGSIZE * segment * size_view ); /* メモリの開放 */ free ( mem ); /* ファイルクローズ */ close ( fd ); close ( fd2 ); exit ( 0 ); }

  • ファイル操作のプログラム

    アルファベットの小文字を大文字に変換しながらファイルをコピーするプログラムですが形として書いてみたのですが・・・小→大に変換する場所、コマンドライン引数、細かい間違い等教えてくださればと思います。プログラムの条件として ・コマンドラインには,「実行プログラム名」「コピー元ファイル名」「コピー先ファイル名」を入力してプログラムを実行し,これらを引数としてコピーを行う. ・ コマンドラインへの入力が正しく行われているか(コピー元ファイルやコピー先ファイルも入力されているか)確認を行う. ・ファイルから読み取った文字が,小文字であるかを判断する必要があるので,ファイルから文字を「1文字ずつ」読み取って, 小文字であれば変換してコピー先に出力, その他の場合はそのままコピー先に 見にくいものではありますがよろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[])) { FILE *infp, *outfp; int ch; if ( argc != 3 ){ /* コマンドラインからの入力が正しいか */ printf("There is no FILE NAME. \n"); exit(1); } if ( infp != argv[1] ) { printf("INPUT FILE OPEN error. \n"); } else { if ( outfp != [2] ) { printf("OUTPUT FILE OPEN error. \n"); } else { /* 入力・出力ファイルの条件が整ったので,コピー作業を行う */ if ((infp = fopen(argv[1], "r")) == NULL) { /* コピー元ファイルのオープン */ printf("can't open %s\n", argv[1]); return 1; } if ((outfp = fopen(argv[2], "w")) == NULL) { /* コピー先ファイルのオープン */ printf("can't open %s\n", argv[2]); fclose(infp); /* コピー元ファイルのクローズ*/ return 1; } while ((ch = fgetc(infp)) != EOF) { fputc(ch, outfp); /* コピー先ファイルにコピー元ファイルの内容を書き込む*/ } fclose(infp); } fclose(outfp); } return 0; }

  • コマンドラインから引数を渡すことについて

    ----------------------------------------------- #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[ ]) { FILE *fin,*fout; char ss[256]; if(argc != 3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルをオープンできません\n"); exit(1); } while(fgets(ss,256,fin)!=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; } ----------------------------------------------- 以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。 「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、 abcdef ABCDEF 012345 を「bbb.txt」にコピーしていきます。 そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、 >tcopy aaa.txt bbb.txt と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、 int main(int argc,char *argv[ ]) のargcに引数が何故代入されるかが分かりません。 後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

専門家に質問してみよう