• 締切済み

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

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

  • hp00
  • お礼率0% (0/2)

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

if ( infp != argv[1] ) { printf("INPUT FILE OPEN error. \n"); } else { if ( outfp != [2] ) { printf("OUTPUT FILE OPEN error. \n"); } else { /* 入力・出力ファイルの条件が整ったので,コピー作業を行う */ この部分は間違ってますし不要と思います infpはFILE*でargv[1]はchar*ですので比較自体が無意味です [2]はargv[2]の間違いだと思いますが上記同様意味がありません fclose(infp); } fclose(outfp); } の } を2個とも削除して fputc(ch, outfp); /* コピー先ファイルにコピー元ファイルの内容を書き込む*/ の前に小文字大文字変換処理を追加したらいいと思います。 小文字大文字変換は、使っていいのならctype.hヘッダをincludeしてtoupper( )関数を使えばいいでしょう。

関連するQ&A

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

    コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #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); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。

  • ファイル操作

    コマンドライン引数から、データを入力し、入力データ中の数字を'*'文字で置き換え、それ以外の文字をそのまま出力させるプログラムを作るため #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' というようなエラーが出ます。 なぜか教えていただけませんか? また、その他、足りないところがあれば教えていただけませんか?

  • 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でも良いような気がするのですが・・・

  • ファイルの入出力プログラムについて

    san.txtに(I can do it )と書いて以下のプログラムを実行したらメ噫|リ メ噫|リ メ噫|リ メ噫|リ メ噫|リ メ噫| とバグってしまいました。なぜですか? #include <stdio.h> #include <stdlib.h> main () { FILE *outfp; char str[256];    if (( outfp = fopen("san.txt", "w"))       ==NULL) { printf("ファイルオープンエラー\n"); exit(1); } while(fputs(str, outfp)){ printf("%s", str); } fclose(outfp); return 0; }

  • C言語の質問です

    下記のプログラムはコマンドラインからコピー元ファイルとコピー先ファイルを指定し、コピーするプログラムです。 (コピーの際にタブ文字を適切な数のスペースに置き換えます) /* ファイルをコピーしてタブを削除する */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *from, *to; char ch; int tab, count; /* コマンドライン引数の数が適切かどうか確認する */ if(argc!=3) { printf("使用法: <プログラム名> <コピー元> <コピー先>\n"); exit(1); } /* コピー元ファイルを開く */ if((from = fopen(argv[1], "r"))==NULL) { printf("コピー元ファイルを開くことができません\n"); exit(1); } /* コピー先ファイルを開く */ if((to = fopen(argv[2], "w"))==NULL) { printf("コピー先ファイルを開くことができません\n"); exit(1); } /* ファイルをコピーする */ count = 0; while(!feof(from)) { ch = fgetc(from); if(ch=='\t') { for(tab = count; tab<8; tab++) fputc(' ', to); count = 0; } else { if(!feof(from)) fputc(ch, to); count++; if(count==8 || ch=='\n') count = 0; } } fclose(from); fclose(to); return 0; } 【質問】 「ファイルをコピーする」部分のif文のelseブロック部分が何を行っているのか分かりません。 ひとつひとつの動作は分かるのですが、全体的に何をしようとしているのか分かりません! 教えていただけないでしょうか?

  • ファイル入出力について

    次のようなプログラムを作りました。 コマンドラインから二つのファイルの名前を読み取り、最初の引数のファイルを2番目の引数のファイルにコピーするプログラムです。 質問は下のプログラムのコメント /*この行が質問です*/ の所です。 //ファイルをコピーする の部分の始めに while(!feof(from)) という条件を書いているため、/*この行が質問です*/ の行は不要であると思いましたが、実際にこの一行をのぞいてコンパイルして実行したところ、日本語が文字化けしてコピーされてしまいました。その後、この行を追加してコンパイルして実行すると文字化けもなく実行できました。 なぜこの行が必要なのでしょうか。 よろしくお願いします。 //ファイルコピー #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {   FILE *from, *to;   char ch;   //引数の数の確認   if (argc != 3) {     printf("引数の数が違います");     exit(1);   }   //コピー元ファイルを開く   if ((from = fopen(argv[1],"r")) == NULL ) {     printf("コピー元ファイルオープンエラー");     exit(1);   }   //コピー先ファイルを開く   if ((to = fopen(argv[2],"w") )== NULL ) {     printf("コピー先ファイルオープンエラー");     exit(1);   }   //ファイルをコピーする   while (!feof(from)) {     ch = fgetc(from);     if(ferror(from)) {       printf("コピー元ファイル読み込みエラー");       exit(1);     }     if (!feof(from))       /*この行が質問です*/       fputc(ch,to);     if (ferror(to)) {       printf("コピー先ファイル書き込みエラー");       exit(1);     }   }   if (fclose(from) == EOF) {     printf("コピー元ファイルクローズエラー");     exit(1);   }   if (fclose(to) == EOF) {     printf("コピー先ファイルクローズエラー");     exit(1);   }   return 0; }

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #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; でやると上手く実行できないのですが、なぜでずか?

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

    ----------------------------------------------- #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]に何故対応しているかが分かりません。 教えていただければ嬉しいです。

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

    #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> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。

専門家に質問してみよう