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

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>C言語でレコード長を調べるための関数はありますか?



 ファイル先頭から最初の「改行文字」までを第一レコード、次の「改行文字」までを第二レコード、・・とすると

  fgets() がよいのでは・・。
  改行文字までを文字配列に格納するので、strlen() で、この文字配列の長さを求めるだけかと・・。

  http://www.bohyoh.com/CandCPP/C/Library/fgets.html
  http://www.bohyoh.com/CandCPP/C/Library/strlen.h …

  下にソースを掲載します(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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/26 20:43

Koyucode.altのほうはバイナリファイルってことはないでしょうか。


だとすると、ますますレコード長を自動で調べるのは無理です。
16進ダンプを眺めたりして、フォーマットを解析するしかないですね。

無理にKoyucode.altを調べる必要がないなら、Koyucode.txtだけ相手にしてりゃいいように思えますけど。
    • good
    • 0

#!/bin/sh


while read line
do
echo ${line} | wc -c
done < test

ではどうでしょうか。
    • good
    • 0

C では基本的に「ファイル = バイトの並び」です. つまり, (利用者が設定しない限り) 「レコード」という単位は存在しません.

「レコード」が存在しなければ「レコード長」も存在しないので, そのような関数は (自分で作らない限り) ないということになります.

この回答への補足

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

補足日時:2009/05/25 22:54
    • good
    • 0

αとβの関係は?同一ファイル内の値ですか?質問の意味がよくわかりません。

もう少しわかりやすく質問していただけるでしょうか。

この回答への補足

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

補足日時:2009/05/25 22:30
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qfreadでデータがない場合の読込値は?

あるバイナリデータからデータを読み込んでいます。

全てデータを読み込んだら、データの読み込みを終了させたいと考えています。

データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと考えたのですが、間違いでしょうか?
do~while();文を使った場合、()内には何を代入したらいいですか?

どうしてもわからなくて困っております.
ご存知の方がいましたら教えていただけないでしょうか?
よろしくお願いいたします.

Aベストアンサー

>データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと
>考えたのですが、間違いでしょうか?
最後に\0は読み込まれません。
freadは読み込んだ要素の数を返します。要素のサイズが1の場合は、読み込んだバイト数が返ることに
なります。そうすると、戻り値が0の場合が、読み込みの終わりと判断することになるのですが、
読み込み時、エラーがあった場合も、freadは0を返します。つまり、エラーなのかファイル終端なのかは、freadの戻り値だけでは、判断できません。従って、その後、feofを呼び出し、ファイル終端に達しているかを確認します。ファイル終端なら、正常終了、そうでないならエラーが発生していると、判断します。


>do~while();文を使った場合、()内には何を代入したらいいですか?
do whileでは難しいです。while(1)を使用したほうが、簡単に作れます。

上記を踏まえて、作成したサンプルが、以下の内容です。
ファイル名をsample.cとして、プログラムsampleを作成後、
sample xxx
(xxxは読み込みたいファイル名)とすると、
毎回、読み込んだファイルのサイズを出力し、正常であれば「正常終了」
が、表示されます。
-----------------------------------
#include <stdio.h>
#include <errno.h>
int main(int argc , char *argv[])
{
FILE*fp;
size_trsize;
intret;
charbuff[256];
if (argc != 2){
printf ("%s ファイル名\n",argv[0]);
return 0;
}
fp = fopen(argv[1],"rb");
if (fp == NULL){
printf("ファイルオープン失敗:errno=%d\n",errno);
return 10;
}
while(1){
rsize = fread(buff,1,sizeof(buff),fp);
//読み込んだ要素数が0なら終了
//但し、これはエラーが発生したから0なのか、ファイル終端に達したから0なのかを
//区別できない(freadの仕様のため)
if (rsize == 0) break;
//とにかく正常に読めたので、その処理をおこなう。
//読み込んだサイズはrsizeバイトである
//rsizeの内容を印字して、処理とする(実際の処理は質問者が実装する)
printf("rsize=%d\n",rsize);
}
//breakから抜けたとき、ファイル終端に達していることを確認する
if (feof(fp) == 0){
//ファイル終端に達していない、つまり何らかのエラーがあった
printf("ファイル読み込み失敗:errno=%d\n",errno);
//既にエラーが起こっているのでfcloseのエラーはチェックしない
fclose(fp);
return 10;
}
ret = fclose(fp);
if (ret != 0){
printf("ファイルクローズ失敗:errno=%d\n",errno);
return 10;
}
printf("正常終了\n");
return 0;
}

------------------------------------

>データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと
>考えたのですが、間違いでしょうか?
最後に\0は読み込まれません。
freadは読み込んだ要素の数を返します。要素のサイズが1の場合は、読み込んだバイト数が返ることに
なります。そうすると、戻り値が0の場合が、読み込みの終わりと判断することになるのですが、
読み込み時、エラーがあった場合も、freadは0を返します。つまり、エラーなのかファイル終端なのかは、freadの戻り値だけでは、判断できません...続きを読む


人気Q&Aランキング