• ベストアンサー

どなたか、教えて下さい(C言語)

Oh-Orangeの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★ソースでの回答です。 >ソースを教えていただけるとありがたいです。  ↑  私のサンプル・ソースと見比べてみて下さい。 ・分かりやすくするために main()、merge_sort()、merge_fputs() の3つの関数に  処理を分けました。マージ処理は merge_sort() 関数です。昇順、降順対応。  (解説はしませんので解読してね!) #include <stdio.h> #include <string.h> /* このファイルで使用する定数 */ #define FILE_1  "file1.txt" #define FILE_2  "file2.txt" #define FILE_OUT "merge.txt" // ファイル出力と標準出力(マクロ関数にしても良い) void merge_fputs( FILE *fo, const char string[] ) {  fputs( string, fo ); // ファイル出力  fputs( string, stdout ); // 標準出力 } // 2つのファイルをマージする関数(本題) void merge_sort( FILE *fo, FILE *fp1, FILE *fp2 ) {  char buff1[ 1024 ];  char buff2[ 1024 ];  int sw, cmp;    // 最初の読み込み位置へジャンプ  goto start;    for ( ; ; ){   cmp = +strcmp( buff1, buff2 ); // 昇順(小さい順にマージ出力) // cmp = -strcmp( buff1, buff2 ); // 降順(大きい順にマージ出力)      if ( cmp < 0 ){ // file1<file2…file1を出力(昇順時)    merge_fputs( fo, buff1 );    if ( fgets(buff1,sizeof(buff1),fp1) != NULL ) continue;    sw = 2;   }   else if ( cmp > 0 ){ // file1>file2…file2を出力(昇順時)    merge_fputs( fo, buff2 );    if ( fgets(buff2,sizeof(buff2),fp2) != NULL ) continue;    sw = 1;   }   else{ // file1=file2…両方を出力(昇順時)    merge_fputs( fo, buff1 );    merge_fputs( fo, buff2 ); start:sw = 0;    if ( fgets(buff1,sizeof(buff1),fp1) != NULL ) sw |= 1;    if ( fgets(buff2,sizeof(buff2),fp2) != NULL ) sw |= 2;   }   switch ( sw ){ // 読み込めなかった場合の処理(終了)    case 0:                 return;    case 1: merge_fputs( fo, buff1 ); return;    case 2: merge_fputs( fo, buff2 ); return;   }  } } // メイン関数(ファイルのオープン/クローズの処理) int main( void ) {  FILE *fp1 = NULL; // ソートされたファイル1  FILE *fp2 = NULL; // ソートされたファイル2  FILE *fo = NULL; // マージ出力のファイル  int merge = 0;   // マージ実行のフラグ    if ( (fp1 = fopen(FILE_1,"r")) != NULL ){   if ( (fp2 = fopen(FILE_2,"r")) != NULL ){    if ( (fo = fopen(FILE_OUT,"w")) != NULL ){     merge_sort( fo, fp1, fp2 );     merge = 1;     fclose( fo );    }    fclose( fp2 );   }   fclose( fp1 );  }  if ( merge ){   printf( "2つのファイルをマージしました。\n" );  }  else{   if ( fp1 == NULL ) printf( "%s ファイルが見つかりません。\n", FILE_1 );   if ( fp2 == NULL ) printf( "%s ファイルが見つかりません。\n", FILE_2 );   if ( fo == NULL ) printf( "%s ファイルに書き込めません。\n", FILE_OUT );  }  return 0; }

altair56
質問者

お礼

お礼が遅くなり申し訳ありません。詳しくサンプルを出して頂けて 感謝しています。何とか問題をクリアできました。ありがとうございました。 

関連するQ&A

  • C言語

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ まではやったんですが(参考書で勉強)。 その次になにを勉強したらよく分からないので、 何を勉強するべきか教えてください。 将来的にこれっと言った作りたいものは決めていません。 お願いします。

  • C言語における乱数と標本分布について

    標準正規乱数と自由度3のカイ2乗分布からt分布を作りたいのですが、よろしくお願いします。 (標本数は10万で、各乱数はテキストファイルに読み込み、テキストファイルに出力します)

  • C言語で地図を描きたい

    C言語で、地図を描くプログラムを作ろうと考えていますが、 どなたか参考になりそうなソースや文献などご存知でしょうか。 東京湾などの形状を描くつもりですが、将来的に 詳細/広域切り替え機能も必要になります。 海岸線を正確に描くためには、 画面外にある地形座標とも線を繋ぐ必要がありますが これをどう処理しようか考えあぐねています。 標準出力にXY座標を与えて線を描く関数や、 緯度経度をXY座標に変換する関数は用意しています。

  • c言語:ファイルの入出力

    2つの行列をファイルから読み込み、その積をファイルに出力するプログラムを 作りたいのですが、参考書を読んでもよくわからないので教えて頂きたいです。 テキストファイルの文字列のコピーなどは、参考書を見てできたのですが、 ファイル入出力を使った数値の計算がいまいち理解できませんでした。 注意点は以下の通りです。 ・ファイルはカンマ区切りのテキストファイルとし、入力ファイルはエクセルで作成。拡張子は.csv。 ・ファイル名はキーボードから入力できるようにする。 よろしくお願いします。

  • 「INT86(・・・・・・);」 って何でしょう?(C言語)

    C言語のソースをみていると、その中に INT86(); という関数が出てきました。 しかし、ソースのどこを見ても その関数が定義されているところがありません。 ほかにIncludeされているファイルは Windows標準のヘッダーファイルだけでした。 そこで質問なのですが、 この「INT86()」というのは標準の関数なのでしょうか? ご回答お願いいたします。

  • WindowsXpProでC言語でCGI

    自宅のXp Proをサーバーにして,Apache2.2やメールサーバを動作させています。昨日,Apacheでssiやcgiを実行可能にして,次のような簡単なプログラムをコンパイルして,hello.exeを作って,試してみました。 #include <stdio.h> #include <conio.h> int main() { printf("Hello"); /*getch();*/ } htmlファイルは, <!--#exec cgi="counter.exe" --> <!--#include file="count.dat" --> <!--#exec cgi="hello.exe" --> としています。実は,counter.exeは自作カウンターなのですが,標準出力が表示されず,しかたなく,#includeでカウンタファイルの値を表示させています。hello.exeも同様にファイルに書き出して,includeすれば大丈夫なのでしょうが,いろいろな資料やhpを見る限り,上記ソースのように標準出力でできるはずだと思うのです・・・。 Windowsをサーバにした場合は,標準出力は表示されないのでしょうか? どなたか,アドバイスいただけないでしょうか。

    • ベストアンサー
    • CGI
  • C言語の四則演算

    C言語で次のようなプログラムを作りたいのですが ソースを教えていただけないでしょうか? 四則演算のみの計算式を標準入力から受け取り計算式の通りに計算を行い計算式と答えを標準出力に出力する どなたか教えてください

  • アセンブリ言語とC言語について。

    以下のURLで、 https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al … No.14のC 言語の write の仕様そのもので、第一引数はファイルディスクリプタですね。 (ファイルディスクリプタについては御自身で調べてみてください) 固定値として定義されているのは、標準ストリーム ファイルの  0 … 標準入力 (write では使われない)  1 … 標準出力  2 … 標準エラー出力 です。(3 以降は各プロセスでオープンされたファイルやソケットやデバイスを 指しており、固定値ではなくプロセス毎に異なる値となります。) 括弧の所がよくわかりません。教えていただけると幸いです。すみません。

  • C言語でTIFファイルを読み込むプログラムを教えてください。

    C言語でTIFファイルを読み込むプログラムを教えてください。 C言語でTIFファイルを読み込むプログラムを組みたいのですが、テキストや参考書、ネットで調べてもよく分かりません。 もしお分かりになるのでしたらプログラムの一連の流れ(ソースプログラムも書いていただけるとなおさら嬉しいです)を教えていただけると助かります><

  • 2つのテキストファイルのマージについて

    現在C言語を学習中の超初心者の者です。C言語のファイル処理や関数、マージ、ポインタの処理に悪戦苦闘している日々を送っています(泣) 皆様に、是非、アドバイスを頂けたらと思い、投稿させて頂きました。 2つのテキストファイルを読み込み、それぞれ、ファイルの中身の文字列をソートし、昇順に並び替え、さらに、その2つのファイルをマージし、昇順に並び替え表示させる(関数を用いて)課題をクリアできずにいます。 int main(void) { char strAry1[20][20]; char strAry2[20][20]; //ファイル1"menber1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル1情報ソート sortString( ); //ファイル1ソート後出力 putOut( ); //ファイル2"kantoku1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル2情報ソート sortString( ); //ファイル2ソート後出力 putOut( ); return 0; } main()関数はこのようなイメージで考えているのですが、どうのように処理すればよいのでしうか?(泣)質問がアバウトで申し訳ありません。ちなみに、2つのテキストファイルの中身は (1) "menber1.txt"-------- takahara inamoto endou nakazawa komano abe nakamura (2) "kantoku1.txt"------ torushie ofuto jico oshimu kamo okada farukan です。一応、途中まで考えて、いきずまってしまったソースです。→ int getData(char *filename, int count, char ss[][20]); void putOut( char ss[][20], int count); void sortString( char ss[][20], int count); int main(void) { char strAry1[20][20]; char strAry2[20][20]; int count = 7; //ファイル1情報を取得 getData("menber1.txt", count, strAry1); //ファイル1ソート前出力 putOut( strAry1, count); //ファイル1情報ソート sortString(strAry1, count ); //ファイル1ソート後出力 putOut( strAry1, count); //ファイル2情報を取得 getData("kantoku1.txt", count, strAry2); //ファイル1ソート前出力 putOut( strAry2, count); //ファイル2情報ソート sortString(strAry2, count ); //ファイル2ソート後出力 putOut( strAry2, count); return 0; } //ファイル情報を取得  int getData(char *filename, int count, char ss[][20]) {      FILE *fp1; if((fp1 = fopen(filename, "r")) == NULL){ //ファイルオープン printf("ファイルオープンできません\n"); exit(1); } count = 0; while(fp1 != NULL){ fgets(ss[count], 20, fp1); //1行単位で文字列取得 if(feof(fp1)) break; count++; } fclose(fp1); return 0; } //ファイルを出力する void putOut( char ss[][20], int count) { int i; for(i=0; i<count; i++){ printf("%s",ss[i]); } printf("\n"); } //ファイルをソートする void sortString( char ss[][20], int count) { int i,j; char temp[20]; for(i=0; i<count-1; i++){ for(j=i+1; j<count; j++){ if(strcmp(ss[i], ss[j]) > 0){ strcpy(temp, ss[i]); strcpy(ss[i], ss[j]); strcpy(ss[j], temp); } } } printf("ソート後\n"); } 少しでも情報がほしいです(泣)皆様忙しいと思いますが、助言をお願い致します。