• ベストアンサー

任意のファイルを別のファイルにコピーするプログラム。

コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fp; if ((fp = fopen(argv[0],"r") == NULL){ printf("ファイル%sが存在しません。\n",argv[0]);exit(-1); } if ((fp = fopen(argv[1],"w") == NULL){ printf("ファイル%sがコピーできません。\n",argv[1]);exit(-1); } fclose(fp); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。

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

  • ベストアンサー
回答No.1

おそらくこのソースだとかなり問題があると思います。 1.argv[0]は自分です。  test.exe aaa bbbとした場合、  argv[0]="test.exe"  argv[1]="aaa"  argv[2]="bbb"  となります。 2.fpが一つしか定義されていません。  FILE *fp1, *fp2として二つ定義しそれぞれのポインタを格納しましょう。  ⇒一回目のfopenのfpを二回目で又使ってしまっています。 3.fcloseはファイルごとに行いましょう。 4.これではファイルを開いているだけで、  書き込んでいる作業がどこにもありません  書き込むにはfwriteです。 簡単なフローとしては、 1.argv[1]をオープンして内容を読込み内部バッファに保存しておく。 2.argv[2]をオープンして内部バッファの内容を書き込む。 3.両方クローズする。 ですね。 これ以外にも方法はいろいろあります。 わからなかったら補足して下さい。

その他の回答 (2)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

他のお二方の回答に加えて、 fopen()の第2引数を上から順に "rb" "wb" にする必要があります。 これがないと、ファイル中の0x1Aをファイル終端として認識してしまい、それ以降のデータはコピーされません。 テキストファイルのコピーだけしか行わない場合は不要ですが…

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

エラー発生時に処理が中断されていません。 元のファイル(argv[1])が存在しなくても、先のファイル(argv[2])が書きこみ不能でも強引にコピーしようとして更なるエラーを引き起こすでしょう。 一般に、コマンドラインで使用するプログラムはエラーを検知したら 1 エラーを回避する為の処理(正しいファイル名の再入力など)を行う 2 処理を中断する どちらかです。 この場合、エラーメッセージが表示されているので0以外の値でreturnするべきでしょう。 以下、余計なお世話かもしれませんが… ・エラーはメッセージはprintf()よりもperror()のほうがよい ・コピー先ファイルが既に存在するときもエラーにしたほうがよいかもしれない

関連するQ&A

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • コマンドラインによるファイル名指定

    #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp,*fpc; int i=0; char line[1000]; fp = fopen("test.txt","r"); if(fp == NULL) { printf("File not found.\n"); exit(1);  }  fpc = fopen(argv[1],"w"); if(fpc==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } while(fgets(line[i],1000,fp)!=NULL){ i++; } for(i=3;i<0;i--){ fprintf(fpc,"%s",line[i]); } fclose(fp); fclose(fpc); return 0; } コマンドラインでファイル名を指定し、そのファイルに、test.txt(4行の文字列)の内容を各行を逆順に書き出すプログラムですが、上手くいきません。ご指摘を願いします。

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

    次の問題の解答をお願いします。 次のプログラムには問題があり、コピー先ファイルへ書き込んでいる途中にエラーが発生した場合を想定していない。エラーが発生した場合にメッセージを表示してすぐに終了するようにプログラムを修正せよ。また各行の説明もせよ。 #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; エラーメッセージを表示するにはどうしたらいいのかよくわかりません。 よろしくお願いします。

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

    アルファベットの小文字を大文字に変換しながらファイルをコピーするプログラムですが形として書いてみたのですが・・・小→大に変換する場所、コマンドライン引数、細かい間違い等教えてくださればと思います。プログラムの条件として ・コマンドラインには,「実行プログラム名」「コピー元ファイル名」「コピー先ファイル名」を入力してプログラムを実行し,これらを引数としてコピーを行う. ・ コマンドラインへの入力が正しく行われているか(コピー元ファイルやコピー先ファイルも入力されているか)確認を行う. ・ファイルから読み取った文字が,小文字であるかを判断する必要があるので,ファイルから文字を「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; }

  • ファイルコピープログラムについて

    まだC言語とか始めたばかりであまりよく分からないのですが、 今、ドラッグしたファイルをデスクトップにコピーするプログラムを作成してるのですが、少し困ったことになりました・・・・ 一応ファイルのコピーをデスクトップに作成はできるのですが、 何故か、作成されたファイルのサイズが2バイト程大きくなります・・・。 ファイルサイズを変えずにコピーする方法が分かりません・・・ ソースを張っておきますので、誰か解決策を教えていただけないでしょうか? #include <stdio.h> #include <windows.h> int main(int argc,char *argv[]) { FILE *fp,*copy; int buf; if(argc>1){ rename(argv[1],"DATA.bin"); fp=fopen("DATA.bin","rb"); copy=fopen("c:/xxx/yyy/Desktop/COPY.bin","wb"); while(1){ fread(&buf,sizeof(buf),1,fp); fwrite(&buf,sizeof(buf),1,copy); if(feof(fp)){ puts("OK"); fclose(fp); fclose(copy); rename("DATA.bin",argv[1]); rename("COPY.bin",argv[1]); exit(1); } } } return 0; }

  • 探索アルゴリズム

    テキストファイルを読み込んで、該当する文字列を含む行を表示するというプログラムを作りたいのです。ファイルを読み込むことはできるのですが、該当する文字列を含む行を表示するやり方がわかりません。どなたか助けてもらえないでしょうか? 一応私が作ってみたプログラムはこんな感じになったんですけど・・・ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {  FILE *fp;  char ch;  if( argc != 3)  {  printf(" 使用法 : <プログラム名> <ファイル名> <文字> \n");  return -1;  }  if((fp = fopen(argv[1],"r")) == NULL)  {  printf("ファイルを開くことができません\n");  return -1;  }  while(( ch = fgetc(fp)) != EOF)  if(ch == *argv[2])  {  printf("%cが見つかりました\n",ch);  break;  }  fclose(fp);  return 0; }

  • 文章から改行を削除して表示する

    #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char row[124]; int c; if( (fp=fopen(argv[1],"r")) == NULL){ fprintf(stderr,"eror\n"); exit(1); }else{ while(fgets( row , sizeof(row) , fp)!=NULL){ printf("%s",row); } fclose (fp); } } というコードでtex.txtという文章ファイルから改行を削除した結果を表示したかったのですが、結果としてオリジナルとまったく同じ文が出てきます。fgetsで改行はふくまれないようにしたつもりなのですが、何故でしょう?解説お願いします。 text.txt: abcdefg hijklmn opqrstuvwxyz

  • C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問

    C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問です! ファイルを開いた後でエラーとなるのですが、何が足りないのでしょうか? ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int k,i=0; int num[10]; char na[10][20]; fp=fopen(argv[1],"r"); if(fp==NULL){ printf("ファイルを開けません\n"); return 1; }else{ printf("開けた\n"); } while(fgets(str,sizeof str,fp)!=NULL){ tp=strtok(str," "); num[i]=atoi(tp); tp=strtok(NULL," "); strcpy(na[i],tp); i++; } printf("%d\n%s\n",num[0],na[0]); printf("%d\n%s\n",num[1],na[1]); fclose(fp); 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]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

専門家に質問してみよう