• 締切済み

C言語について

丸投げ的な質問は本当にすいません。m(_ _)m 恥ずかしいことをしましだが、教えてください。 1.WinXP 2.変更前のデータ(ファイル) 3.変更後のデータ(ファイル) 4.変更させるルール ア.データの中から"YYYY"を検索します。  イ.文字列"AAAA"がある場合は"YYYY"上の行の文字列("BBBBB")を"AAAA"の下に入れます。(N?????は変更なし)  ウ.次の"YYYY"を検索して上の行の文字列("CCCCCC")を前の"YYYY"下にいれます。  エ.イとウをデータの最後まで繰り返して元のファイルに保存します。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

No.1 です。 >C言語の知識はないが、・・・  とんでもない、反って Hello, world! などと失礼しました。 >元のファイルに保存します。  ★これは適当ではありません。新しいファイルに書き出しましょう。  → ミスがあっても、「やり直し」が可能です。   fp2 = fopen( "test.new", "w" ); 《ヒント》  (「ファイルをオープンできない」などのエラー処理 )  ・全レコード、読み込んでしまう。     int n = 0;     char buf[20][STR_MAX];     while( NULL != fgets( buf[n++], STR_MAX, log_fp ){} // {} 必要  ・「データの中から"YYYY"を検索します」は、     strstr() を利用すればよいと思います。     例       for( i = 0; i < 14; i++ ){        if( strstr( &buf[ i ][7], "YYYY" ) ) 《 i までの出力処理》;       }      注:&buf[ i ][7] は、レコード先頭の N????? をカットした        8文字目(以降)を示します。  ・「○○の下に入れます」は、buf の中での入れ替えでなく、   新しいファイルへの出力する「順番◆」で対応すればいいのでは・・。  ・「N?????は変更なし」は、データ中の N????? は利用せず、    fprintf( fp2, "N%05d %s", ( i + 1 ), &buf[ k ][7] ); と、    「作り出して」しまえば簡単かなと・・。↑8文字目から出力。   ★ここの、k◆ を「決定」するのが、ご質問主旨ですよね。    ちょっと面倒くさそう。どこまで出力したかの変数が必要・・?。 ☆中途半端で申し訳ない、「主旨」以外が参考になれば・・(はあぁ?)。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/index.html
Ksou
質問者

お礼

《ヒント》ありがとうございます。

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

補足で投稿されたコードで何が分からないのでしょう ご質問の内容を処理するには1行ごとの1Pass処理では不可能です どうしてかといえば 仮に YYYYが見つかっても前後の行などの情報がないからです 出力行の番号を管理する変数の準備と初期化 行ごとに読み込んで YYYYが見つかるまでストックしておきます ... 1) ストックする際に『Nxxxx 』の部分はカットしておきます 『YYYY』が見つかったらストックした最後のアイテムを出力 最後のアイテムを出力したと判断出来るような機構を準備(フラグやデータ自体を特定の物に変更) 残りのアイテムを順に出力 入力ファイルの終端まで1) に戻って繰り返し 入力ファイルの最後まで来た際にストックが残っているなら出力する といった具合かと … 命題のなかで『AAAA』が無かった場合の対処は示されていませんが

Ksou
質問者

補足

ご回答ありがとうございます。 最初の一行目には必ず文字列『AAAA』あります。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.1

(申し訳ない、「回答」ではありません) #4051340 で「補足」という形で「改める」か、この「質問」でリンクさせるか、データ部分を再掲しないと、なにがなんだかサッパリ判りませんよ。 落ち着いて・・。 ---------------------------------- #4051340 で、 >C言語の知識はないが、課題なので困ってます。  としています。  お望みのソースが手に入った場合、「試行できる環境」にあるのでしょうか。  それとも、動作確認無く、コピペで提出するのでしょうか。←「丸投げ」そのものです。 >丸投げ的な質問は本当にすいません。m(_ _)m  「標準出力に、Hello, world! と表示する」だけのプログラムを《補足》して下さい。  ・「丸受け」したソースを理解・説明できないと、なおさら困りますよ。 ---------------------------------- 今は、「C言語の知識を身につける」よりも「課題提出」が緊急課題と思います。  きっと優しい方から「回答」が得られると思います。  課題提出後、参考URL等でC言語を学ばれたら如何でしょう。 ---------------------------------- 差し障りがなければ、 「C言語の知識はない」のに、「課題」が出された理由・背景を《補足》願えないでしょうか。 ---------------------------------- 本日、参加されたようですが・・・。  同じ質問を締め切らずに、複数するのはルール違反のようです。 ++++++++++++++++++++++++++++++++++ 以上2点の《補足》と、#4051340 のデータ部分を「補足」欄にコピペしたら如何でしょう。

参考URL:
http://www.kumei.ne.jp/c_lang/
Ksou
質問者

補足

ご丁寧に教えていただき、ありがとうございます。 試行できる環境」ー> Microsoft Visual Studio 6.0 自分が今書けるソース #include <stdio.h> #define STR_MAX 256 int main(void) { char buf[STR_MAX ]; FILE* log_fp = fopen("test.dat","r"); while(fgets(buf,sizeof buf,log_fp) != NULL) printf("%s",buf); fclose(log_fp); return 0; } test.dat 変更前 N00001 AAAA; N00002 M10; N00003 M11; N00004 BBBBB; N00005 YYYY; N00006 M12; N00007 M13; N00008 CCCCCC; N00009 YYYY; N00010 M14; N00011 M15; N00012 DDDDDDD; N00013 YYYY; N00014 EEEEEEEE; 変更後 N00001 AAAA; N00002 BBBBB; N00003 M10; N00004 M11; N00005 YYYY; N00006 CCCCCC; N00007 M12; N00008 M13; N00009 YYYY; N00010 DDDDDDD; N00011 M14; N00012 M15; N00013 YYYY; N00014 EEEEEEE

関連するQ&A

専門家に質問してみよう