• ベストアンサー

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

ファイルの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