• 締切済み

C言語について

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

  • Ksou
  • お礼率59% (13/22)

みんなの回答

  • 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

  • C言語について教えて下さい。

    C言語について教えて下さい。 C言語の知識はないが、課題なので困ってます。 助けてください!!! 変更前 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

  • C言語 ファイルの指定された行を表示

    こんにちは。 回答お願いします。 今私は作業の高効率化を目指すためプログラムを考えています。 まだぜんぜんできていませんが・・ ファイルの指定された行を表示する関数がないだろうか? もしくは似たような方法はないだろうかと考えています。 できれば例題とともに教えていただければ幸いです。 具体的にどういう風にしたいのかというと ----test.txt------- aaaa bbbbb cccccc dddd eeeeeeee ffffff ------------------- というファイルがあったとしたらgetsで4と入れてやったら 四行目のddddが表示されるようにしたいのです。 まだまだ初心者ですのでさっと考えることができません。 どうかご教授お願いします。

  • EXCELについて

    EXCELについて お世話になります。 EXCELで1つのセル内で自動的に改行させたいのですが、良い方法が分かりません。 例)AAAA BBBBB CCCCCC DDDDDDD      上記のようにスペースで区切られた文字列を、下記のように改行して表示させたいのです。   尚、A,B,C,Dの文字数は化変しますので、左から何文字目といった検出方法は無理です。   スペースは必ず入ります。   AAAA    BBBBB    CCCCCC    DDDDDDD 宜しくお願い致します。  

  • CSV 指定列 文字列 C言語

    失礼します、C言語である文字列が入っている行だけを読み込みたいのですが、どのような考え方で可能でしょうか? 例 XXX,YYYY,OOOO TTT,LLLL,KKKK,GGGG,DDD MMM,WWWW,AAAA 例えば1行づつ読み込んだ時にLLLLが入っていれば その行のKKKK~DDD 改行が入るまで読み込みたいです。 よろしくお願い致します。

  • C言語についてです。

    C言語についてです。 次のようなテキストファイルがあるとします。 ------------------------------------- Sample.txt ------------------------------------- 項目一  項目二  項目三 1      2     1 2      1     3 3      3     1 ------------------------------------- 一行目が文字列、2行目以降が整数というファイルです。 このファイルを読み込み、1行目の文字列を表示し、2行目以降を読み込んでn行3列の配列に入れ更に表示したいのですが、どのように書けばいいのでしょうか? 宜しくお願いします。

  • エクセル ある文字列が含まれるセルを検索する方法

    初めて問い合わせします。大量のデータを検証しなければいけません。 関数などで方法を教えて頂ければ幸いです。 1セルに対し、1セルを検索する方法はわかっております(countifやifを使って) でも、セル単位ではなく文字列単位での検索方法を知りたいと思います。 わかりづらいかもしれませんが、現状をお知らせします。 シート1「登録データ一覧」(5万件) A列1行目 ア社 A列2行目 イ社 A列3行目 ウ社 A列4行目 エ社 A列5行目 ☆ーア社 A列6行目 ウー☆社 シート2「検索したい社名一覧」(500社) A列1行目 ア社 A列2行目 イ社 A列3行目 ウ社 <出したい結果> (1)検索したい会社が、シート1上で何社登録があるか ア社→【答え:2社】 イ社→【答え:1社】 ウ社→【答え:2社】 (2)登録データ一覧上、検索したい会社が存在するか ア社→【答え:○】 イ社→【答え:○】 ウ社→【答え:○】 エ社→【答え:×】 ☆ーア社→【答え:○】 ウー☆社→【答え:○】 よろしくお願いします。

  • Excel(2000)で行毎にセルをみて、値を返す

    例えば、以下のようなデータがあったとして、各行毎に左から見た結果、最初にデータがあったセルの列の1行のセルの値を各行のG列に返したい。 ______A__B__C__D__E__F__G__ 1行_ア__イ__ウ__エ__オ__カ____ 2行_1__3__5__2__4__1__ア__ 3行_____2__5__1__5__4__イ__ 4行_____________2__8__2__エ__ 5行_____2______2__1__4__イ__ 6行_________5______2______ウ__ G列に結果。 例えば、G3のセルに何らかの関数を入れて、A3~F3を左から見た結果、B3に2というデータがあるので、その列の1行であるB1の値、イをG3に返すといったないようです。 _ は、スペースをとるためのものです。 実際のデータは500行あり、各行の検索する列数は23列あります。 よろしくお願い致します。

  • PowerShellでの文字列置換ができない

    PowerShellで「\」を含む文字列が変換できません。たぶん正規表現とかで問題があると思うのですが・・・ あとテキストファイル内の文字列置換で指定された文字列がある行があった場合、その行を削除するといったことは出来るのでしょうか? 詳しい方いらっしゃいましたらよろしくお願いいたします。 <テキスト> BBBB AAAA NNNN AAAAあああA NNNN AAAA <検索文字列> あああ ※行内に「あああ」をみつけたらその行を丸ごと削除したい・・・

  • EXCEL LOOKUP

    検索列に一致する場合、表示列の文字を表示させたいので LOOKUP関数を使用したのですが正しい表示になりません。 新しくシートを作成して同じように試してみると出来るので データの形式で影響されたりするのでしょうか? (a)(b) 検索 表示 1 ア 2 ア 3 イ 4 イ 5 ウ 6 ウ

  • perlでの文字抽出

    はじめて質問させていただきます。 perlでの文字抽出について教えてください! ---------------------------- #c,aaaaa,0000 #c,bbbbb,00000 #c,bbbbb,0000 : #s,dddd,AAAA,xxxxx,yyyyy time,1 id, 1 type,1 : #e #s,eeee,AAAA,bbbb,cccccc time,2 id,2 type,2 : #e #s,fff,BBBB,zzzzzz,kkkkk time,1 id,1 type,1 : #e #s,eeeee,AAAA,rrr,qqqqqqqqq time,3 id,1 type,3 : #e : ---------------------------- のようなテキストファイルがあります。 #sから#eまでがひとくくりで、それが繰り返し出現し、それぞれの#sから#eまでの長さはバラバラです。 このとき、#sの行の3番目の要素がAAAAで、かつid,1となっているものについて、それぞれの要素を抽出しcsvファイルに ---------------------------- time   id    type 1     1     1 3     1     3 : ---------------------------- のように書き出したいのですが、perlのプログラムはどのようにしたらよいのでしょうか? ---------------------------- while(<INFILE>){  if(/^#s/../^#e/){   if(($_=~/AAAA/){    if($_=~/id,1/)){ : ---------------------------- とするとif(($_=~/AAAA/)で、#sの行しか抽出できないためid,1の検索が出来ず、行き詰ってしまいました。 perlを勉強し始めたばかりの超初心者で、質問が分かりにくいかと思いますが、よろしくお願いします。

専門家に質問してみよう