• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:照合に関するプログラムについて)

プログラム実行時の意図した出力が得られない理由を教えてください

このQ&Aのポイント
  • 質問者は、aaa.txtファイルとbbb.txtファイルに記述されている数値を比較し、bbb.txtファイルの中でaaa.txtファイルの数値と一致する行を「name」という文字と共に出力したいと考えています。
  • しかし、現在のプログラムでは意図した出力が得られていません。
  • 質問者は、このプログラムの誤りや改善点を知りたいとしています。

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

  • ベストアンサー
noname#208507
noname#208507
回答No.6

> --- aaa.txt > 1.4 > 2.5 > 2.7 > 2.1 > > --- bbb.txt > XMS 2.5 > XMS 2.7 > XMS 1.1 > XMS 1.0 > XMS 2.1 > XMS 1.4 おおっ、なるほど。 もし私だったら、質問者さんと同様に rewind を使うでしょう。 ファイルをディスクから読み込むという前提を置いてよければ。 #include<stdlib.h> #include<stdio.h> #include<stdbool.h> #include<string.h> #include<math.h> #define EPS 10e-6 /* 数値の比較 */ static bool equal_distance(char *line_a, char *line_b) {  double dist_a, dist_b;  char ignore[64];  sscanf(line_a, "%lf", &dist_a);  sscanf(line_b, "%s %lf", ignore, &dist_b);  return fabs(dist_a - dist_b) < EPS; } /* ファイルaの各行と, 行line_b の比較 */ static void compare_lines(FILE *a, char *line_b) {  char line_a[64];  rewind(a);  while (fgets(line_a, sizeof line_a, a) != NULL) {   if (equal_distance(line_a, line_b)) {    if (strchr(line_b, '\n') != NULL) line_b[strlen(line_b)-1] = '\0';    printf("%s %s\n", line_b, "name");    return;   }  }  printf("%s", line_b); } /* ファイルa,bの比較 */ static void compare_files(FILE *a, FILE *b) {  char line_b[64];  while (fgets(line_b, sizeof line_b, b) != NULL)   compare_lines(a, line_b); } int main(int argc ,char *argv[]) {  FILE *a, *b;  if (argc != 3) exit(EXIT_FAILURE);  a = fopen(argv[1], "r");  b = fopen(argv[2], "r");  if ((a == NULL) || (b == NULL)) exit(EXIT_FAILURE);  compare_files(a, b);  fclose(a);  fclose(b);  return EXIT_SUCCESS; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

--- aaa.txt 1.4 2.5 2.7 2.1 --- bbb.txt XMS 2.5 XMS 2.7 XMS 1.1 XMS 1.0 XMS 2.1 XMS 1.4 こんな具合かと #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) {   FILE *fp[3];   char lbuf[256];   char line[3][10][32] = {""};   char src[10][32] = {""};   int n, m;   int cnt;   // aaa.txtを取得   if ( NULL != ( fp[0] = fopen( "aaa.txt", "r" ) ) ) {     cnt = 0;     while( fgets( lbuf, sizeof( lbuf ), fp[0] ) ) {       sscanf( lbuf, "%s", src[cnt] );       cnt++;     }     fclose( fp[0] );     // bbb.txtを読み込み aaa.txtを検索する     if ( NULL != (fp[1] = fopen( "bbb.txt", "r") ) ) {       n = 0;       while( fgets( lbuf, sizeof( lbuf ), fp[1] ) ) {         // XMS と 2.5などを分離して読み込む         sscanf( lbuf, "%s %s", line[0][n], line[1][n] );         for( m=0; m < cnt; m++ ) {           // 2.5などを aaa.txtのデータと照合           if ( strcmp( line[1][n], src[m] ) == 0 ) {             // 見つかれば nameを設定し 照合を中断             strcpy( line[2][n], "name" );             break;           }         }         n++;       }       fclose( fp[1] );       // ccc.txtの書き出し       if ( NULL != ( fp[2] = fopen( "ccc.txt", "w" ) ) ) {         for( n=0; line[0][n][0] != '\0'; n++ ) {           // XMS 2.5を書き出し           fprintf( fp[2], "%s %s", line[0][n], line[1][n] );           if ( line[2][n][0] != '\0' ) {             // nameが設定されていれば書き出し             fprintf( fp[2], " %s", line[2][n] );           }           // 改行を追加           fprintf( fp[2], "\n" );         }         fclose( fp[2] );       }     }   }   return 0; }

seturi38
質問者

お礼

おお、なるほど。回答ありがとございます。

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.4

#1さんへ >> while(fscanf(gp,"%lf",&dis)==1){ >このgpは >> gp=fopen("Nline.txt","r"); >で代入されていますが、Nline.txtは >> system("rm Nline.txt"); >で削除されています。削除されたファイルからは読めないと思うのですが。 unix系限定になると思いますが、ファイルをオープンした状態ならファイル(名)を削除してもファイルの読み書きはできます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

-------aaa.txt------- -------bbb.txt------- 1.4 XMS 2.5 2.5 XMS 2.7 2.7 XMS 1.1 2.1 XMS 1.0               XMS 2.1 XMS 1.4 レイアウトがくずれているため、aaa.txtとbbb.txtの内容を正確に把握することができません。 >char command[30] = "wc "; > system("rm Nline.txt"); wcコマンドやrmコマンドがない環境のことを考慮される方がいいような気がします。 >while(fscanf (fp[0],"%s %lf",x,&distance==9){ 閉じカッコが足りないため、コンパイルエラーが出ると思います。

全文を見る
すると、全ての回答が全文表示されます。
noname#208507
noname#208507
回答No.2

質問文にある aaa.txt と bbb.txt の例は下で正しいですか。 ------- aaa.txt 1.4 XMS 2.5 2.5 XMS 2.7 2.7 XMS 1.1 2.1 XMS 1.0 ------- ここまで ------- bbb.txt XMS 2.1 XMS 1.4 ------- ここまで ccc.txt の例で「name」が付いている行の数字は 2.5、 2.7、 2.1、 1.4 の四種類ですが、なぜ「同じ数値を示すものをその数値がある行ごと取り出し、行末にnameという文字を出力」すると ccc.txtのようになるのでしょう? 何か足りないのでは。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> while(fscanf(gp,"%lf",&dis)==1){ このgpは > gp=fopen("Nline.txt","r"); で代入されていますが、Nline.txtは > system("rm Nline.txt"); で削除されています。削除されたファイルからは読めないと思うのですが。 間違いではないけど、気になる部分としては > FILE *fp[argc] argc個配列で用意する意味は?結局、fp[0]しか使ってないですよね? あと、最近の仕様では、配列の大きさの指定に変数が使えるようになっていますが、もともとは定数しか使えませんでした。 > fscanf(gp,"%d%s%s%s",&linemax,file1,file2,file3); fscanfのマニュアルで、書式のところを良く読みましょう。 変数に取り込まない書式があります。 単語数、文字数に対応する変数名がfile1,file2というのは、間違いではないですが、なんか気持ち悪いです。 > system(command); > system("rm Nline.txt"); なぜ、外部コマンドを使っているのでしょうか? ここでやってることは ・wcコマンドで行数を数えて Nline.txt という一時ファイルに保存する ・Nline.txtを消す の2つです。 ファイル消去にはremove関数があります。 行数を数える部分もCで書けば、そもそもNline.txtを作成する必要もありません。 C言語で作らず、シェルスクリプトやawk,Perl等のスクリプトで作った方が簡単ではないですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルの統合プログラム

    ----aaa.txt-------- name number band J0223 1.0 2.2 J0222 null 1.2 J0221 2.0 null J0224 2.0 2.0 ----bbb.txt--------- name time J0222 11.0 J0223 22.0 ----ccc.txt---------- name number J0222 20 J0221 J0223 10 ---望む結果------ name number band name time name number J0223 1.0 2.2 J0223 22.0 J0223 10 J0222 null 1.2 J0222 20 J0221 2.0 null J0221 J0224 2.0 2.0 上記のような中身の3つのファイル(各columnはタブで区切れられている)を用意して、aaa.txtの一列目の文字列とbbb.txt,ccc.txtの一列目の文字列が一致する行だけを抜き出してaaa.txtの各行のあとにくっつけるプログラムを書きたい(望む結果)のですが、どう書いていいわかりません.これまでは、下記のプログラムのようにいちいちcolumnの変数を定義して上記のような処理をしてきたのですが、今回扱うファイルはcolumnの数が多く(100個)、columnの変数を一つ一つ定義して書くのは非常大変になると思います.ですので、出来ればcolumnの数がわからなくともファイルを読みこませれば上記のような処理を行なってくれるプログラムが書きたいです.どなたかご教授いただけないでしょうか.回答よろしくおねがいします. 内容がわかりづらかったらすいません. ----------プログラム--------------- #include<stdio.h> int main(void) { FILE *fp ,*gp; int ret; char xl[30],nx1[30],xls[30],nx2[30],xlb[30],nb2[30]; fp=fopen("bbb.txt","r"); gp=fopen("aaa.txt","r"); while(fscanf (fp,"%s%s",xls,nx2)==2){ while(fscanf (gp,"%s%s%s%s",nx1,xl,xlb,nb2)==4){ ret=strcmp(xls,nx1); if(ret == 0){ printf("%s\t%s\t%s\t%s\t%s\t%s\n",xl,nx2,nx1,xl,xlb,nb2); } } rewind(gp); } fclose(fp); return 0; }

  • プログラムのことについてご質問します。

    プログラムのことについてご質問します。 先日から以下のプログラムのことについて悩んでいます。 このプログラムは、テキストファイル(内容は「名前,成績」)を読み込んで、テキストファイル(内容は「名前,成績,偏差値」)を書きだすというものなのです。てか、そのつもりで作りました。 コンパイルの時は、エラーが出ないのですが、いざ起動してみると、プログラムが終了せず、書き出しも行われません。 #include<stdio.h> #include<math.h> int main(int argc,char *argv[]){ FILE *rfp; FILE *wfp; int nline = 0; double score[100]; double sum_score = 0; char name[100][256]; int i; double heikinn; double hensati[100]; double ga[100]; double g[100]; double gg=0; double d=0; if (argc != 3){ fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]); return -1; } if ((rfp=fopen(argv[1],"r")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[1]); return -1; } if ((wfp=fopen(argv[1],"w")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[2]); return -1; } while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){ sum_score += score[nline]; nline ++; } heikinn=sum_score/nline; for (i=0; i<=nline; i++){ ga[i]=(score[i]-heikinn); g[i] = ga[i]*ga[i]; gg += g[i]; } for (i=0; i<=nline; i++){ d= gg/(nline-1); hensati[i]=10*ga[i]/sqrt(d)+50; } for(i=0; i<=nline; i++){ fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]); } fclose(wfp); fclose(rfp); return 0; } 皆様のお力をおかりできないでしょうか? よろしくお願いします。

  • C言語でのファイル検索&ファイル書き換えについて

    C言語である特定のフォルダを指定して、その階層内(サブフォルダも含む)にあるファイル、例えばsample_nameをファイル名に含むファイルを見つけ、そのファイル内の例えば下のような書き換えを行えるようなプログラムはどうつくればいいのでしょうか。 元ファイル ~sample_name1.txt~ aaa, 10 bbb, 20 ccc, 30 ~sample_name2.txt~ aaa, 30 ccc, 12 bbb, 20 ddd, 15 上のように各ファイルにaaaやbbbが共通に含まれています。 対象ファイル:sample_name 対象文字列:aaa 変換後:100 変換後ファイル ~sample_name1.txt~ aaa, 100 bbb, 20 ccc, 30 ~sample_name2.txt~ aaa, 100 ccc, 12 bbb, 20 ddd, 15

  • ファイル操作のプログラムについて

    下記のsample1.txtの1列目とsample2.txtの1列目の文字列が一致する行をつなげて出力するプログラムを組みたいと思い、test.cを書きましたが、うまく動きませんでした。これは何が原因なのでしょうか。 回答よろしくお願いします。 -------------------sample1.txt-------------------- J02220-2222 3.999 null J03424-2222 900.0 0.43 J03666-2223 30.0 0.23 J04000-4422 98.0 0.43 -------------------sample2.txt-------------------- J03424-2222 900.0 0.43 J03342-4423 4.000 0.99 J02220-2222 3.999 null -------------------test.c--------------------------- #include<stdio.h> int main(void) { FILE *fp ,*gp; int ret; char xl[30],nx1[30],xb[30]; char xls[30],nx2[30],xlb[30]; fp=fopen("sample1.txt","r"); gp=fopen("sample2.txt","r"); while(fscanf (fp,"%s%s%s",xl,nx1,xb)==3){  while(fscanf (gp,"%s%s%s",xls,nx2,xlb)==3){  ret=strcmp(xl,xls);  if(ret == 0){  printf("%s\t%s\t%s\t%s\t%s\t%s\n",xl,nx1,xb,xls,nx2,xlb);    }  }  } fclose(fp); return 0; } インデントが反映されいなかったらすいません。 ------------出力結果------------------- J02220-2222 3.999 null J02220-2222 3.999 null -----------望む出力結果-------------- J02220-2222 3.999 null J02220-2222 3.999 null J03424-2222 900.0 0.43 J03424-2222 900.0 0.43

  • 二つのファイルから一行ずつ取り出して計算

    aaa.txt と bbb.txtというファイルがあり、それぞれ 1.1 0.1 -0.2 0.9 … といった感じで一行ずつ数値が入っています。 シェルスクリプトを用いて、 この二つのファイルから一行ずつ取り出して足し算を行いたい (例えばaaa.txtの一行目が1.1、bbb.txtの一行目が0.9なら1.1+0.9=2.0) のですが、どうすれば良いでしょうか。

  • 二つのファイルから一行ずつ取り出して計算

    aaa.txt と bbb.txtというファイルがあり、それぞれ 1.1 0.1 -0.2 0.9 … といった感じで一行ずつ数値が入っています。 C言語を用いて、上記ファイルを読み込み、 この二つのファイルから一行ずつ取り出して足し算を行いたい (例えばaaa.txtの一行目が1.1、bbb.txtの一行目が0.9なら1.1+0.9=2.0) のですが、どうすれば良いでしょうか。

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

  • 構造体とfscanf

    ファイルをfscanfを使って文字列を構造体に格納して読み込みたいのですが読み込み方の記述方法がわか りません。 どのようにしたら読み込めますか? 以下ソース ---ソース--- #include <stdio.h> #include <string.h> #include <stdlib.h> struct info //1回目の呼び出し方法 { char name[20]; char mb[20]; }deta; struct info2 //2回目の呼び出し方法 { char *name; char *mb; }deta2; struct info3 //3回目の呼び出し方法 { char *name[6]; char *mb[6]; }deta3; void main(void){ FILE *fp; fp=fopen("yasa.txt","r+"); while( !feof( fp ) ){ fscanf( fp, "%s %s",deta.name,deta.mb ); printf("%s %s\n",deta.name,deta.mb); } rewind( fp ); //2回目の呼び出し方法での記述の仕方がわからない rewind( fp ); //3回目の呼び出し方法での記述の仕方がわからない fclose(fp); } ---yasa.txtの内容--- オレンジ ● みかん ● いちご × もも ● ぶどう × キウイ ●

  • C言語 教えてください

    data.txtの中に入っているデータを読み込み、 全て出力するというプログラムを作ろうとしています。 しかし、上手く読み込み表示させることが出来ません。 自分で出来るだけ調べたのですが、 どこがおかしいのかわからないので教えてください。 ↓↓↓現在作っているプログラムです↓↓↓ #include <stdio.h> void main(void) { FILE *fp; char number, name; if ((fp = fopen("data.txt", "r")) == NULL) { printf("FILE OPEN ERROR\n"); } else { while (fscanf(fp, "%s%s", number, name) == 2) { printf("%s-%s\n", number, name); } } fclose(fp); printf("FILE CLOSE !!\n"); } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↓↓data.txt↓↓ 001 aaa 002 bbb 003 ccc 004 ddd 005 eee ↑↑↑↑↑↑↑↑ よろしくお願いします。

  • 行数ごとに検索をかけて並び替えをしたいのですが・・

    数千のファイル名が書かれたテキストファイルがあります。(Aとします。) /yyy/ccc.txt /aaa/aaa.txt /bbb/bbb.txt /sss/aaa.txt /ccc/bbb.txt /zzz/ccc.txt ・ ・ ・ ユニークファイル名だけ書かれたファイルがあります。(Bとします。) aaa.txt bbb.txt ccc.txt ・ ・ ・ Bの行数1行ずつAで検索をかけ、ファイル名を新しいファイル(Cとします)に書き出したいのです。 /aaa/aaa.txt /sss/aaa.txt /bbb/bbb.txt /ccc/bbb.txt /yyy/ccc.txt /zzz/ccc.txt ・ ・ ・ シェルを使ってやりたいのですが、どのようにすればいいのか見当もつきません。 どなたかお分かりのかたいましたら教えてください。よろしくおねがいします。