• ベストアンサー

別ファイルの内容を検索したいのですが、(超初心者です)

現在、独学でC言語を勉強しているのですが、 別のファイル(.dat)にあるデータの内容を 該当するデータだけ表示させたいのですが、 どうやったらできるのかわかりません。。 例えば、、、 別ファイルの内容が、 145556 1 C言語 256885 2 C言語その1 456789 3 C言語その2     : という風になっていたとして、 プログラム実行中に 145556 と入力したら C言語 と表示されるような 行ごとに入力されたデータの最初の6桁を検索して 必要な部分だけを表示することはできるのでしょうか? もし、できるのであれば どのようにプログラムを作成すればいいのか教えてください! そして、勝手なのですが、勉強中なので  どうして そうなるのかも教えて欲しいのです。 よろしくお願いします。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

勉強中ということであれば、多少は分かっている、ということですね? こんな感じだけど。 #include <stdio.h> #include <string.h> int main(void) { FILE* in; char buf[1024]; char key[256]; /* 検索キーの入力 */ printf("input key: "); gets(key); /* データファイルを開けて */ in = fopen("h.data", "r"); while (fgets(buf, sizeof(buf), in) != NULL) { /* 一行ずつ読み込む */ /* 行の最初の6文字が一致すれば */ if (strncmp(buf, key, 6) == 0) { /* 適当な処理を行う */ printf("%s\n", buf); } } return 0; } # 教科書では、文字列、文字列操作、ファイル処理、あたりを分かっていれば OK

その他の回答 (1)

  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

知りたいのはファイルを読んで文字列化するところでしょうか? 文字列の先頭のみで内容を検索するところでしょうか? 文字列の後半を切り出し、変数に取り込むところでしょうか? シンプルな手順としては ・ファイルをストリームで展開し一行ずつ読み文字列(char pointer)として取得 ・文字列を半角SPで分割し、「行」と空白区切りの二次元配列に格納(char_moji[][]とする) ・配列の1次元目でLOOPし、char_moji[i][0]が検索目的の文字列と一致するか確認 ・一致した要素がjであればchar_moji[j][2]が表示対象の文字列となる。 他にも ・ファイルを全部メモリに展開し、検索したい文字のポインタを取得。 ・そのポインタから該当文字数分、ポインタをずらす。 ・さらにそのポインタから改行コードまでが表示対象文字列となる。 アルゴリズムは以上のような感じであり、この他にもハッシュテーブルやリンクリストを使うなどいろいろな手法があると思います。 これらは動作する環境や、工程にかかる期間などからどのように作るか判断するのが普通です。 業務で急いでいるのであれば別ですが、Cの勉強が目的というのであれば、もう小さい機能に落とし込んでから作るのがいいです。 たとえば、ファイルを読むだけの機能、文字列を分割するだけの機能、配列から検索するだけの機能など。 そのほうが飲み込みやすいですし、質問で提示した機能も、これらの機能から拡張していくだけでできますから。 下記に勉強にいいサイトのURLを書きます。参考になれば幸いです。

参考URL:
http://www.kumei.ne.jp/c_lang/

関連するQ&A

  • ファイルの読み取りについて

    現在C言語の勉強中ですが、 テキストファイルがあったとします。 ファイル内容 abc ,111 def ,222 ghi ,333 っとあったとします。 プログラムで入力した数値で、どの行番号のどのブロックの 文字列を取得し表示したいのですが、行とブロックの指定方法が わからなくて困っています。 ご回答よろしくお願いします。

  • C言語でのファイルの作成について(超初心者です)

    C言語を独学で勉強しています。 のちのち、C++も使えるようにと思い、ソフトも購入し使っています。 本(C言語のみ)などを見てサンプルプログラムを入力して実行はできるのですが、 フォルダとファイルの関係が全くわかりません。 1つサンプルプログラムを作るごとにフォルダを作成して 実行を繰り返しているのですが、 本当にそうしないといけないのでしょうか? 例えば、2つ以上のファイルを使ったプログラムは どうしたらいいのでしょうか? 超初心者なので コンパイルした後にできるファイルの意味も よくわかりません。 うまく説明できないのですが、このあたりのファイルの流れと意味を わかりやすく教えてもらえませんか? また こうした方がいいというものがあれば教えてください。 よろしくお願いします。

  • C言語でのファイル読み込み

    C言語でのファイル読み込みに関してお尋ねしたいことがございます。 たとえば、「test1.dat」というような数字が複数行記載されたデータファイルがあり、 それを配列に読み込んで作業をしたのちに、 同じ作業を「test2.dat」「test3.dat」・・・というようなデータファイル (これらも、test1とは異なる数字が複数行記載されたデータファイル)にも 施したい場合、どのようなループ処理をすればよいのでしょうか? perlの場合ですと比較的簡単にできたのですが、 Cの場合はどうしたらいいかわかりません。 どうぞよろしくお願いいたします。

  • データファイルを開かずにコピー、別ファイルに転記

    データファイルを開かずに、該当行をコピー、別ファイルに転記する方法を教えてください。 ・ユーザーフォームを持つファイルがあります(仮ファイル名:印刷用ツール.xls)  ユーザーフォームには、テキストボックス(番号入力用)と、コマンドボタンがひとつあります  印刷用ツール.xlsのSheet1は「印刷用シート」になっています。  印刷用ツール.xlsのSheet2は、「印刷用シート」に表示するためのデータが入るデータシートです。 ・↑とは異なるデータファイルがあります(仮ファイル名:データファイル.xls) データファイルには A列に番号 、B~D列には番号に付随する情報データが入力されています。 (例)  A   B   C   D  1  りんご 青森 150 2  いか  新潟 200 ***以下、実行したい内容のイメージです (1)ユーザーフォームのテキストボックスに番号を入力して、コマンドボタンを押す ↓ (2)テキストボックスに入力された番号と同じ番号をデータファイル.xls内で検索する(データファイル.xlsを開かずに) ↓ (3)データファイル内で検索して合致した番号行を行ごとコピーする ↓ (4)コピーしたデータを印刷用ツール.xlsのSheet2の1行目に貼り付ける(貼り付ける前にSheet2の1行目をクリアする) (後は、Sheet2のデータはSheet1(印刷用シート)で、表示したい部分だけを表示して印刷します) 宜しくお願い致します。

  • C言語初心者過ぎてわからないです

    エクセルのCSVデータなんですが 1行目のデータを 1行目から5行目まで同じデータ 6行目のデータを 6行目から10行目まで同じデータ 10行目のデータを 10行目から15行目まで同じデータ 以上のような作業を繰り返し元のCSVのデータをすべて5行(つまりデータの量は5倍)にしたいのですが C言語でこのような作業を行うファイルをつくるにはC言語ではどのようなプログラムになるでしょうか

  • ファイルから文字列を読み込んで、検索するプログラム

    以下のようなプログラムをつくりたいのですが、 どうしたらよいでしょうか?? 文字列を配列型に入れるときにわからなくなって しまうのですが。。。 ファイルからデータを順番に読み込み,メモリ上に一次元配列構造に並べて線形探索するプログラムを作成せよ. データの仕様 一行に、 「番号(スペース)読み仮名(スペース)文字列(住所)」 があり、これが10~1000行ほど、ファイルに(.dat) 入っている。 ファイルを配列に読み込んだあと、 番号を入力すると、住所が検索されてでてくる。 問題文も微妙なのですが、 これは番号の配列と住所の配列は別にして、 検索したほうがいいですよね、、? 何かヒントになることだけでも良いので、 よろしくお願いします!

  • WSHでエクセル」を検索表示

    WSHを使ってデータを入力、エクセルファイル内を検索して、該当データがある行のいくつかのセルの内容を表示する方法があればおしえてください。

  • EXCELで別ファイルからデータを抽出するには?

    EXCELについて条件に一致する列の内容を抽出する方法を教えてください。 シート1の行に日付があり、列に品名と日ごとの数を入力してあるシートがあります。 このシートの内容を別のシートに日付を入力すると、その日の内容が表示されるようにしたいのですが、うまくいきません。 [シート1]     1    2    3   4 (←日付) A品  10  20  30   40… B品  30   10  40  20… C品  15  16   17  18… D品  20  21   22  23… [シート2]     *(←日付を入力) A品 (   ) B品 (   ) C品 (   ) D品 (  ) シート1とシート2はそれぞれ別ファイルで同時に開いている状況です。 シート2の*部分に日付を入れると該当する日付の各品名の数量が( )の部分に表示されるようにするにはどうしたらよいですか?

  • エクセル 別のファイルにデータを流し込む方法

    エクセル 別のファイルにデータを流し込む方法 エクセルで、1つのファイルに入力してあるデータの内、 特定の行のデータを指定して、別のファイルに体裁(レイアウト)を変えて 表示させる方法を教えてください。 具体的には、例えば、元データのファイル(仮にBook1)が、 列に、A列-日付、B列-時間、C列-利用場所、D列-顧客番号、 E列-顧客氏名、F列-利用内容、G列-判定 というような項目を並べて、 1行ずつ、データが入力してあるファイルがあるとします。 この元データのファイルを利用して、別のファイル(仮にBook2)、 例えば、FAX送信用の紙のような書式のファイルに、 1枚の紙に、1人分のデータを、 流し込んで表示させるようなことをしたいと思っております。 これを、Book2の1個1個のセルに、元となるBook1のセルを参照するよう いちいち入力するのではなく、 Book1の特定の1行を指定すれば、その行に入力してあるデータが 自動的に(一発で)Book2のシートに反映されるようにしたいのですが、 良い方法がありますでしょうか。 ご存知のかたがいらっしゃいましたら、 お教えいただけると嬉しいです。 どうぞよろしくお願い申し上げます。

  • c言語でファイルを読み書き→別のファイルを読み書き

    最近、c言語の勉強をし始めました。 今日、ファイルの読み書きを勉強していて、ふと思ったのですが、 c言語でファイルを読み書き→別のファイルを読み書きのループってできるのですか。 例えば、list1 を読み込み○○して syuturyoku1 に書き込み、その後、list2を読み込み○○して syuturyoku2 に書き込み・・・のループです。 ファイル名は、1~連続の数字です。こんなことって可能なんでしょうか。 できれば、どんな感じのプログラムになるか書いてくれるとありがたいです。

専門家に質問してみよう