• ベストアンサー

レコード長を数えてくれる関数

ファイルの1行のバイトレコード長を知るには あるファイルの中身は以下に示す: α : 62,11, β : 60, ...... 目で見ても、そのファイルの1行の”バイトレコード長”がわからない。C言語でレコード長を調べるための関数はありますか?

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

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

>C言語でレコード長を調べるための関数はありますか?  ファイル先頭から最初の「改行文字」までを第一レコード、次の「改行文字」までを第二レコード、・・とすると   fgets() がよいのでは・・。   改行文字までを文字配列に格納するので、strlen() で、この文字配列の長さを求めるだけかと・・。   http://www.bohyoh.com/CandCPP/C/Library/fgets.html   http://www.bohyoh.com/CandCPP/C/Library/strlen.html   下にソースを掲載します(BorlandC++5.5.1)。   レコード長が「固定」でないファイルを想定しています。 -------------------------------------------------------- ただ、「質問本文だけ」ならこれで当たって?いるかもしれないのですが・・・。 補足文、ちょっと判りづらい、というより矛盾しています。 >そのKoyucode.altを調べてみたら中身はKoyucode.txtとほぼ同じですが、 >・・・ >ファイルの大きさの違いは.txtのほうが3倍大きいです。 (1)「ほぼ同じ」なのに「3倍大きい」って???。   >13行ぐらい違います。   >3倍大きい   .alt が6行とすると、.txt が19行かなぁ。「目で見ても」違いが判りそうなものですが・・。 >もしかしたら1行はある決まったレコードに設定されたかもしれないと推定したんですが、 >α : 62,11, >β : 60, >太郎:113、 >鬼:130、 (2)見かけ上、レコード長は「決まっていない」ようですが・・。レコード末の「改行」まで「空白」が埋まっているのでしょうか。 #include <stdio.h> #include <string.h> #define K_MAX 1000 #define RECL 1024 // テキストエディタなどで確認したレコード長の最大を! typedef struct{  int iLen;  int iCnt; }KIND; int main( void ) {  KIND sRecLenKind[ K_MAX ];  int iLenOrg, i, j, iKind = 0, iAri, iYou, iMax;  FILE *fp;  char cBuf[ RECL ];  fp = fopen( "Z:\\Koyucode.txt", "r" );  if( NULL == fp ){   printf( "ファイルオープンに失敗\n" );   return( 255 );  }  while( NULL != fgets( cBuf, RECL, fp ) ){   iAri = 0;   iLenOrg = strlen( cBuf );   for( i = 0; i < iKind; i++ ){    if( iLenOrg == sRecLenKind[ i ].iLen ){     sRecLenKind[ i ].iCnt++;     iAri = 1;     break;    }   }   if( iAri ) continue;   sRecLenKind[ iKind ].iLen = iLenOrg;   sRecLenKind[ iKind ].iCnt = 1; // 初期化   if( K_MAX <= ++iKind ){    printf( "ソースに栄養を!\n" );    return( -1 );   }  }  fclose( fp );  for( i = 0; i < iKind; i++ ){   iMax = 0;   for( j = 0; j < iKind; j++ ){ // 長いものから出力    if( iMax > sRecLenKind[ j ].iLen ) continue;    iMax = sRecLenKind[ j ].iLen;    iYou = j;   }   printf( "%3d レコード長 = %5d, レコード数 = %5d\n", i, sRecLenKind[ iYou ].iLen, sRecLenKind[ iYou ].iCnt );   sRecLenKind[ iYou ].iLen = 0;  }  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

teakay84
質問者

お礼

Im speechless....you are really really kind person^.^ 本当に本当にありがとうございました。ソースコードは早速実行させていただきました、両方のファイルのレコード長とレコード数を比較して違いが明らかになりました。 コードがレベル高いようですが、これからゆっくり読み解いていきます。 本当にありがとうございました。

その他の回答 (4)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

Koyucode.altのほうはバイナリファイルってことはないでしょうか。 だとすると、ますますレコード長を自動で調べるのは無理です。 16進ダンプを眺めたりして、フォーマットを解析するしかないですね。 無理にKoyucode.altを調べる必要がないなら、Koyucode.txtだけ相手にしてりゃいいように思えますけど。

noname#245945
noname#245945
回答No.3

#!/bin/sh while read line do echo ${line} | wc -c done < test ではどうでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C では基本的に「ファイル = バイトの並び」です. つまり, (利用者が設定しない限り) 「レコード」という単位は存在しません. 「レコード」が存在しなければ「レコード長」も存在しないので, そのような関数は (自分で作らない限り) ないということになります.

teakay84
質問者

補足

なるほど。そのファイルが私が作ったものではないです。そのファイルは固有名詞のリストファイルでありKoyucode.txtと名つけられた。 なぜレコード調べたいかというと似たようなファイルがあってKoyucode.altといいます。そのKoyucode.altを調べてみたら中身はKoyucode.txtとほぼ同じですが、ファイルサイズが違う。もしかしたら1行はある決まったレコードに設定されたかもしれないと推定したんですが、その1行の大きさはどれぐらいなのかどう調べればよいかわからなくて質問しました。 ちなみに両方のファイルの全体の行をwc -l コマンドで調べたら13行ぐらい違います。ファイルの大きさの違いは.txtのほうが3倍大きいです。

  • 1108435
  • ベストアンサー率43% (94/217)
回答No.1

αとβの関係は?同一ファイル内の値ですか?質問の意味がよくわかりません。もう少しわかりやすく質問していただけるでしょうか。

teakay84
質問者

補足

すみません、わかりづらくて。 Koyucode.txtというファイルがあって、その中身の一部は α : 62,11, β : 60, 太郎:113、 鬼:130、 ........ 左辺は固有名詞、右の数字は概念番号だというふうにフォーマットされていました。 そのファイルの1行のレコード長を知りたいですが、どういうふうにレコード長を調べたらよいでしょうか?

関連するQ&A

  • C言語の関数について困っています

    こんにちは。 C言語で、テキストファイルの行数を数える関数があれば教えて頂けないでしょうか。例えば、以下の3行を含んでいるテキストファイルを対象としたとすれば 123465789123456789 1234567981234579 987654321987654321 関数を実行すれば、3という数字が得られ、 123456  789 123546879  123 123  456789123   123456789123 というテキストファイルであれば、4という数字が得られる。そんな関数をご存知な方は私にご教授願えないでしょうか。どうぞよろしくお願いします。

  • テキストファイル内のレコード削除方法

    テキストファイル内に書き込まれているレコード(行)の 1件目(1行目)~n件目(n行目)までを削除したいの ですが、どうプログラミング記述すればよいのですか? よろしくお願いします。 (ANSI/C言語にて)

  • 1レコードからなるファイルを複数レコードに分割

    可変長の1レコードのみのファイル(固定長のレコードが改行コードなくつながっている)をもとにして、固定長のcsvファイルを作成する方法をお教えください。 具体的には、 項目A(10バイト)、項目B(5バイト)、項目C(20バイト)からなる35バイトのデータが改行コードなくつながっている50000バイトくらいの1レコードを入力して、項目A,B,Cから1レコードが構成されるcsvファイルを作成したいと思います。 よろしくお願いします。

  • C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング

    C言語で書き込んだファイルの重複行の削除と行の並び変えるプログラミング ファイル名が 0.txt というC言語で書き込んだテキストファイルがあり その中身は以下のようなものとします。 111 000 222 555 000 444 222 000 これらを行ごとに見て重複行を削除し 更に値の小さな順に並び変えたい、つまりファイル内を 000 111 222 444 555 となるようなプログラミングを考えているのですが 調べても分からず悩んでいます。 c言語のプログラム内に UNIXコマンドを扱う方法を考えているのですが c言語内でUNIXコマンドを併用するためのsystem()関数 や 重複行を削除する uniq というUNIXコマンドを どのようにプログラム内に挿入すればいいのでしょうか? ご回答、よろしくお願いいたします。 ちなみに以下のプログラムは system関数が理解できない私の作成失敗したものです。 #include <stdio.h> #include <stdlib.h> int main(void) { system("uniq 0.txt"); }

  • VC++6でfgets関数の変わりになるような関数はあるのでしょうか。

    現在、VC++6を用いて、MFC を使わずにアプリケーションを作っています。 アセンブラ経験はありますが、C言語経験がないので、四苦八苦しています。 今回、 csv形式のファイルを読込んで、配列に格納したいのですが上手くいきません。 c言語の場合は、fopen関数で開いたファイルを、fgets関数で1行づつ読込み、 strtok関数で、処理すれば良いということが分かりました。 ところが、VC++6のCreateFile関数では、ファイルのポインタの変わりに、 クラスのハンドルが返ってくるので、fgets関数は使えないような気がします。 なにかfgets関数の変わりになるような関数はあるのでしょうか。 質問の意味が分かりずらいかと思いますが、適当に汲み取って教えて下さい。 宜しくお願いします。

  • exeファイルの中身の関数を調べる

    exeファイルの中身の関数(C言語、WINAPI、DirextXなど)を調べるフリーソフトはないでしょうか?情報が足りないところがあれば補足します。

  • C言語 関数の呼び出し関係について

    C言語を習い始めてから、1ヶ月も経っていないんですが、長いプログラム(1万行くらい)の読解という課題が出ました。 読解を円滑に進めていくためのコツとして、「関数の大まかな呼び出し関係」を調べればよい、と学びました。 そこで質問させてもらいたいのですが、「関数の呼び出し関係を調べる」とは、具体的にどういうことなんでしょうか?関数が関数を呼び出しているんですか?? もうひとつC言語について質問です。 今回与えられたプログラムは1万行くらいあるのですが、そのうちmain関数は50行くらいしかありません。 これって、残り9950行はすべて、main関数の動作のためにあるんですか?? 以上、初歩的な質問かもしれませんが、ご指導願います。

  • C言語で、エクセルの中身を読みたい

    C言語で、エクセルやワードの中の文字列を読み込むにはどうしたら良いのでしょうか?テキストファイルからなら1行づつ読めるのですが、エクセルやワードファイルの中身をfgets関数やfread関数を使って読み込もうとしても、文字が化けたものしか取得できません。どのようにしたら良いか教えてください。お願いいたします。

  • MINIX3のソースコード内の関数が見つからない。

    MINIX3のソースコード内の関数が見つからない。 minix/kernel/i8259.cのソースコードを読んでいます。 ファイルの中にintr_disable();という行があります。 しかしgrepで探してもこの関数の中身が書いてあるファイルを見つけることが出来ません。 どこにあるのでしょうか? よろしくお願いたします。

  • 2つのファイルのレコードの差異を抽出したいのです。

    2つのファイルのレコードの差異を抽出したいのです。 ファイルAとファイルBがあります。 ファイルAの中身 id001,日本次郎,25才,東京都,2010/04/06,batch id002,日本花子,20才,千葉県,2010/04/06,batch ・ ・ ・ ファイルBの中身 id000,日本太郎,30才,東京都,2010/04/06,batch(Bにしか存在しない) id001,日本次郎,28才,東京都,2010/04/08,batch(年齢と更新日付が違う) id002,日本花子,20才,千葉県,2010/04/08,batch(更新日付だけ違う) ・ ・ ・ レコードは順不同です。 AとBを比較して同じid(一番左の値です)で更新日付と更新者(一番右です)以外が更新されていたらファイルCに書き出したいと考えています。 ※もしかしたら除外の項目が増えるかもしれないので、左から何文字(何項目)目同士で比較する方法は使うことができません。 どうすればできるか(レコードは数十万件以上になるので速度面も含めて)考えているのですが、何かよい方法はないでしょうか? 性能どころかまだ形にもなっていないので、取り合えず正しい結果を得られることだけを考えて下記のように進めています(それぞれの実装方法は調べながらですが)。 1.Aファイルから1行読み出す。 2.読み出した1行をカンマを区切り文字にして分解する。 3.Bファイルを1行ずつ読み込んで同じように分解して、2で分解したidと同じidだったら、更新日付と更新者以外を比較して違っていたらファイルに書き出す。 4.Bファイルに該当idがなかったらファイルに書き出す。 ※Aファイルの最終行まで2~4を繰り返す。 もっといい方法があると思うのですが、シェルスクリプトの経験がないためごり押しみたいな方法になっています・・・。 もしよろしければアドバイス頂けないでしょうか。

専門家に質問してみよう