エラーチェックをした後のテキストファイルのコピー

このQ&Aのポイント
  • 書かれている値のエラーチェックをした後にコピーしたいプログラムを作成しました。
  • テキストファイルAの内容をエラーチェックし、条件に合致する値をテキストファイルBにコピーします。
  • エラーチェック機能は文字ではなく数字が書かれているかチェックし、さらに値が10以上200未満かも確認します。
回答を見る
  • ベストアンサー

書かれている値のエラーチェックをした後にコピーしたいんですが・・・

テキストファイルAに書かれている値をエラーチェックをしてから、テキストファイルBにコピーするというプログラムを作るため、とりあえずテキストファイルAをテキストファイルBにコピーするという部分だけ作ってみました。(下に載せておきます) これはきちんと動作したので、つぎにエラーチェック機能(具体的には、aファイルには10以上200未満の正の数が書かれていて欲しいため、エラーチェック機能としては、文字ではなく数字が書かれているか? 書かれている値が10以上200未満か? という2つのチェック機能)をつけようとしたのですが、文字ではなく数字が書かれているか?というチェック機能は作れそうですが、書かれている値が10以上200未満か?というチェック機能がどうすればいいのか分かりません。というのも、下のプログラムは1文字ずつ出力しているためチェック不可能なような・・・ということは根本的に違うのでしょうか? 下のプログラムもテキストを見ながら何とか作成したようなレベルなんで、どなたか助言をお願いします。 #include<stdio.h> #include<process.h> void main(void) { FILE *fp1,*fp3; int a,c; if((fp1=fopen("d:a.txt","r"))==NULL){ printf("aファイルが開けません\n"); exit(1);   } if((fp3=fopen("d:b","w"))==NULL){ printf("bファイルが作成できません\n"); exit(1); } while((a=getc(fp1))!=EOF) putc(a,fp3); fclose(fp3); if((fp3=fopen("d:b.txt","r"))==NULL){ printf("bファイルが開けません\n"); exit(1); } while((c=getc(fp3))!=EOF) putchar(c); fclose(fp1); fclose(fp3); }

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Aファイルが一行に1つの数字が書かれているなら、 一行毎に処理すれば良いと思います。 そうすると、数字で構成されているかチェックした後、atoi関数を使って簡単に変換してその範囲をチェックすることもできます。 一行に、複数の数値がスペースやカンマで区切られている様な場合、現在の一文字入力のままでも数値のチェックをしながら数字を作成し範囲チェックすることもできますよ。 まず、数値を入れる変数(仮にxとする)を準備し 0クリアしておきます。 一文字読み込んで、数字であるか判断します。 x=x*10+c-'0'; で桁上げしながら足し込んでいきます。 数値でない文字(カンマやスペース)を読み込んだら、数字の区切りなので、範囲のチェックをし、Bファイルに書き出し、次の準備のためにxを0クリアします。 まあ、だいたいこんな感じでできると思います。

secret-goo
質問者

お礼

atoi関数なんて関数、全然知らなかったんですが、ネットで調べてなんとかチェック機能をつけることができました。 ところが、できると思っていた数字だけで構成されているのかというチェック機能がまだできていません・・・。 自分の勉強不足を痛感します。 というわけで、また新しい質問として、ここで質問したいと思います。 ありがとうございました。

関連するQ&A

  • int型の値をファイルに保存

    int errint(int errnum){  FILE *fp;  if((fp = fopen("error02.txt", "w+b")) == NULL){   printf("ファイルのオープンに失敗しました。\n");   exit(-1);  }  fwrite(&errnum,sizeof(errnum),1,fp);  fclose(fp); } int型の値を受け取ってファイルに 保存する関数を作ったのですが 出力されるテキストが 文字化けしていてうまく動きません。 独習C等の参考書を読んでも自分では分かりませんでした。 どこが間違っているのか教えてください。 よろしくおねがいします。

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

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

  • エラーが出ます

    12,51,13,123,133,551,… というコンマで区切られているファイルを読み込みたいです。数字は100文字です。どう書けば全部読み込めるでしょうか? よろしくお願いします。 int main(int argc,char *argv[ ]){ int line; int i; FILE *fp; fp = (argc > 1)? fopen(argv[1],"r"): stdin; if(fp==NULL){ perror("fopen"); exit(0); }   while(fscanf(fp,"%d",&line) != EOF){ printf("%d\n") } if(argc>1){ fclose(fp);   }

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • セグメンテーションエラーの原因がわからず困っています

    以下のプログラムで”セグメンテーションエラーです”の文字が表示され上手いこと動きません。 何がダメなのか、ご助言を頂けないでしょうか。どうぞよろしくお願いします。環境はCentosです。 #include<stdlib.h> #include<string.h> main(){ char s[11]; FILE *fp; fp = popen("netstat -s |grep total","r"); if(fp = NULL){ printf("reading error"); exit(-2); } FILE *fp2; fp2 = fopen("file.txt","r"); fscanf(fp,"%9s",s); int a; printf("%s\n",s); a = atol(s); printf("%ld",a); pclose(fp); fclose(fp2); }

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • 「コマンドライン引数チェック」て何

    #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; }    以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の  if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・  if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。   以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、  「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!?  よろしくお願いします。  

  • Visual C++ 2005のデバッグエラーについて(コマンドライン

    コマンドラインを利用してファイルを読み込む類のプログラムを作っているのですが、コンパイルしてデバッグなしで開始をすると、エラーが出てしまいます。 調べようとしても原因がわからず困っています。 回答よろしくお願いします。 サンプルプログラム↓ コマンドラインでテキスト形式のファイルを読み込み、特定の部分を表示させたあとに、コマンドラインで指定したファイルに行を逆順にして書き込む・・・といった内容です。 こちらも途中までLinuxで作成、途中からVisual2005で編集・・・といった感じのプログラムです。 #include<stdio.h> #include<stdlib.h> #define LINE 1000 int main(void) { FILE *fp_in,*fp_out; char line[10][LINE]; char rv[10][LINE]; int i,j,k; fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } while(fgets(line[i],LINE,fp_in)!=NULL){ printf("%d\n",i); i++; } i=1; j=0; while(i<3){ if(i==1){ for(j=0; j<=6; j++){ printf("%c",line[i][j]); } } if(i==2){ for(j=11; j<=15; j++){ printf("%c",line[i][j]); } } i++;} fclose(fp_in); fp_in=fopen("test.txt","r"); if(fp_in==NULL){ printf("File not found.\n"); exit(1); } fp_out=fopen("repurica.txt","w"); if(fp_out==NULL){ fprintf(stdout,"Can not open file.\n"); exit(1); } i=0; k=0; while(line[i]!='\0'){ i++; } while(i<4 ){ rv[k++][LINE]=line[--i][LINE]; } rv[j][LINE]='\0'; printf("%s\n",rv); fclose(fp_in); fclose(fp_out); return 0; }

  • C言語でセグメンテーションエラーの原因がわからず困っています。

    こんにちは。いつもお世話になっております。 C言語なのですが、何故かプログラムを実行するとセグメンテーション違反が表示されてしまい全く動きません。皆さんのお力を貸して頂けないでしょうか。 以下が問題のプログラムです。 前提条件: ・別プログラムによりfile.txtは末尾に文章が追加され続けている ・本プログラムは永劫的に動き続ける #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main () { int i = 1, a; FILE *fp, *fp2; char *tok; //NULLを入れて初期化 char buf[1024] = ""; char str[1024] = ""; char str2[1024] = ""; //出力するファイルを開く if ((fp2 = fopen ("out.txt", "a")) == NULL) { printf ("out.txt:open error\n"); exit (-1); } while (1) { //何度もfopenするのでループ二週目以降は一旦fpを閉じる if (str2 != NULL) { fclose (fp); } //一度読み込み、2週目以降もさらに読み込み続ける if ((fp = fopen ("file.txt", "r")) == NULL) { printf ("file.txt:open error\n"); exit (-1); } //str2はループ2週目以降で使われる if (str2 != NULL) { while (1) //新しい行を見つけ出す { fgets (str, 1024, fp); if (strstr (str, str2) != NULL) { printf ("前回の最終行です:%s\n", str); break; } } } else { printf ("str2はNULLです:%s\n", str2); } //fopenで読み込んだ現段階のテキストファイルをout.txtに移す while (1) { if( (fgets (str, 1024, fp) ) == NULL)break; if ((a = strlen (str)) >= 2) { str[a - 1] = '\0'; } else { printf ("抽出した文字列が1文字以下です:%s\n", str); break; } if (strlen (str) >= 17) { strcpy (str2, str); } else { printf ("抽出した文字列が16文字以下です:%s\n", str); break; } printf ("%s\n", buf); fprintf (fp2, "%s\n", buf); strcpy (buf, ""); strcpy (str2, str); } printf ("これが検索語です:%s\n", str2); } fclose (fp2); return 0; } プログラムの内容は、 更新され続けるテキストファイル(file.txt)から、別のテキストファイル(out.txt)に出力するというプログラムです。(file.txtの内容を若干変えつつ、out.txtに出力することが本来の目的ですが、その部分は省略させて頂きました。) fopenで開くと、「その時点まで」のfile.txtしか開かれません。更新され続けているfile.txtの内容をコンスタントに読み取る為に、while文でfopenし続ける方法を取っていますが、そうするとout.txtに移し終わった行まで読み込んでしまい重複した文章をout.txtに移すことになりますので、strstrを使い、「前回fopenで開いたfile.txt」の最終行を検索してその位置からまたout.txtに移す、という方法を取りました。しかし、結果は何故かセグメンテーション違反でした。 以上のプログラムや私の意図する所で何か気づかれた点や、おかしいと思われた点等ありましたら是非ご教授頂きたく思います。 どんな些細なことでも構いませんので、教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

専門家に質問してみよう