🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.c
Article #498

Re: [Q]区切りなしデータを文字型でない配列に読むには?

#498
From: Hiroyuki Minesita
Date: Fri, 20 Mar 1998 00:00
80 lines
3586 bytes

From article <6esjd9$4t@sakunami.gw.tohoku.ac.jp>
	by chiba@dges.tohoku.ac.jp

> [Q]長くて区切り文字のない文字列(数字列)を、ファイルから、行単位で
>    (一行丸ごとという意味)、文字型でない配列に、可能な限り簡潔に、
>    読み込むには?

 根本的にはデータ構造が悪いのでそれを考え直すのが一番です。
#身も蓋もありませんが……(^^;

> なぜこんなことを考えているかというと、最初は
> 
> int i;
> FILE *fp;  /* データファイルのファイルポインタ */
> char CharArray[6]; /* 5バイト分?のデータを一時的に読み込む配列 */
> double DblData[350];  /* 実際にデータを格納する配列 */
> for(i=0; i<350; i++) {
> 	fread(CharArray, 5, 1, fp);
> 	CharArray[6] = '\0';
> 	DblData[i] = atof(CharArray);
> }

 概ねこういう形になるでしょう。
 多分、他を試してもこれ以上は簡単にならなかったんじゃないで
しょうか?


> ここで、ループを使って5文字分ずつ読んでいくのではなく、一行分ずつ
> 一気に読んでしまいたいという考えが浮かんできました。そこでまずは
> 
> char CharArray2D[350][5];
> fread(CharArray2D, 5, 350, fp);
> for(i=0; i<350; i++)
> 	DblData[i] = atof(CharArray2D[i]);

 ループを使っていますよね?

> そこで次にダイレクトに
> FILE *fp;  /* データファイルのファイルポインタ */
> double DblData[350];  /* 実際にデータを格納する配列 */
> fread(DblData, 5, 350, fp);
> 
> などということはできないかと思ってやってみました(というかこれで
> すんなりうまくいっていたらニュースには投稿していませんでしたが)。

 何故出来ると考えられるかが問題な気がします。(^^;
 根本的に変数がメモリにどういう風に存在するのかを理解する
べきだと思います。

> ---(以下、自分の作業環境依存の話?)-------------------------------
> 
> ところが、doubleやfloatには 0.0 より小さい(E-10~E-19のオーダー)値、
> int には 750000000~950000000 くらいの大きな値が入ってしまいます。
> 
> fread(DblData, 5, 1, fp);
> fread(DblData, sizeof(DblData[0]), 350, fp);
> fread(DblData, sizeof(DblData[0]), 1, fp); /* これできちんと読み込め
>                                                 ないのはおかしい? */

 読めないのが当然です。

> のようにもしてみましたが、結果はいずれも同じでした。
> よって、上の結果は自分の環境(OSやコンパイラ)に依存している可能性
> もあります。

 依存していません。言語には多少依存しているかもしれませんが……(^^;
 sizeof(DblData[0]) の値がいくつになるかを確認しましょう。

> アドレス演算子&を用いて

 これ以下はポインタを理解していないと見受けられます。


---
  @)    ----------------------     〃   
  (・>             ヾ<・)   
 ι ν   峯下博幸         (  ~彡 
(m_m)っ ----------------------   κκ   
Technical Details
Message-ID: <6esmcd$30l$1@sunny.njk.co.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6esjd9$4t@sakunami.gw.tohoku.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 106434,8756f6f59b5f78c5
X-Google-Attributes: gid106434,public
From: minesita@rd.njk.co.jp (Hiroyuki Minesita)
Subject: Re: [Q]区切りなしデータを文字型でない配列に読むには?
Date: 1998/03/20
Message-ID: <6esmcd$30l$1@sunny.njk.co.jp>
X-Deja-AN: 335807667
References: <6esjd9$4t@sakunami.gw.tohoku.ac.jp>
Mime-Version: 1.0 (generated by MimeKit/1.7)
Distribution: fj
X-Forwarded: by - (DeleGate/4.3.3)
Content-Type: text/plain; charset=ISO-2022-JP
Organization: NJK CORPORATION. Japan
Newsgroups: fj.lang.c