2016-07-11 3 views
1

私はC言語を使ってデータベースフラットファイルプロジェクトを作成しています。私はメンバーが少ない構造を作りました。私はfwrite()を使ってバイナリファイルとfread()を使ってデータを取得しています。私の2つの主要な質問fread()とfwriteがCプログラミングでどのように動作するか

私たちはテキストファイルで構造を書くことができますか?私は良い例を見ていない。テキスト形式で書くのは事実上間違っていますか?私が "wb"の代わりに "w"を使用して書くとき、私はテキスト形式を取得しますが、いくつかの余分な単語があります。

2番目これらのfread()& fwriteがどのように動作しますか()。それらは、次のブロックのアドレスをどのように取得するかというデータブロック上で動作します。私はポインタを持っていますが、ファイルにはどのアドレスもないので、ポインタが次のブロックにどのように移動するのでしょうか?

+0

いいえ、ファイルがバイナリモードで開いていない場合は、バイナリ構造を読み書きできません。明らかに、ファイルシステムの仕組みや、OS APIがどのようにファイルシステムにアクセスするかについていくつかの研究を行う必要があります。これは実際のファイルアクセスのためにOSに委譲する 'fread()'/'fwrite()'実装の範囲外です。 –

+0

入力のために大丈夫ありがとう:)私はfgets/fputsを使うべきですか?テキスト形式で書く場合 – ekaf

+0

データにランダムにアクセスする場合は、 'fread/fwrite'を実装します(ただし、構造体にポインタが含まれている場合は失敗します)。 'fprintf/fgets'と' sscanf'を使って、データセット全体を読み込み、処理して、ファイルを書き直したい場合、テキストは良いです。バイナリレコードとして保存されたデータは、移植性がないことが多く、プログラムが破損した場合、ファイルされたデータは無駄です。テキストファイルは人間が読める形式なので、データを別のプログラムに読み込むための新しい関数を書く方がはるかに簡単です。クライアントがデータファイルをスプレッドシートと互換性がなければならないと主張していたプロジェクト、CSV形式で作業しました。 –

答えて

1

最初に構造をテキストファイルに書き込むことはできますか?私は、「W」の代わりに、私は、テキスト形式を取得しますが、いくつかの余分な 言葉

と想像してみて「WB」を使用して を書くとき は?テキスト形式でそれを書くのは、それが実質的に間違っ.isは良い例を見ていませんあなたの構造体にはいくつかの整数が含まれています。今度はfwriteを使ってそれらを書くと、これらの整数はバイナリ形式でファイルに書き込まれます。 これをテキストとして解釈しようとすると、これは機能しません。テキストエディタはバイナリ値を文字として解釈しようとします。

あなたの構造は整数3が含まれている場合fwriteを使って書かれたとき、それはビッグエンディアン表記を想定し

00000000 0000000 0000000 00000011 (3 in binary) 

として保存されます。テキストエディタを使用して上で読んでみると、もちろん望みの効果は得られません。

コンパイラによって構造体に挿入される可能性のあるパディングバイトについて何も言及していません。

第二どのようにこれらのfread()& fwriteの作品()。彼らは データのブロック上でどのように次のブロックのアドレスを取得するのかを操作します。私たちは ポインタを持っていますが、ファイルにはどのアドレスもありませんので、ポインタが次のブロックに移動する方法を教えてください。 ブロック?

これは、OSを使用する可能性が最も高いです。

PS。シリアライゼーションの詳細を読んで、テキストファイルとバイナリファイルの違いを理解することをお勧めします。

+0

私はそのようなファイルから従業員の詳細をフェッチし、いくつかのレポート生成のためのテキストとしてファイルに書きたいと思っています。私はfreadとfriteを使用して完全な構造体を書くか、構造体の個々のメンバーを一つ一つ書きます。 – ekaf

+0

@ ekafはバイナリデータの場合はfwrite/fread、テキストデータの場合はtext関数を使用します。シリアライゼーションの詳細を読む –

+0

ありがとう:)助けられた:) – ekaf

関連する問題