掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28719

ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/04 20:01:59)


freadやfwriteを用いて多次元配列を書き込んだり読み込んだりする場合の質問です。

仮にあるTYPEの2次元配列
TYPE data[3][3]={{1,2,3},{4,5,6},{7,8,9}}のデータがあったとします。
TYPEはdoubleとかintとかです。
そして、このデータの中で、2行目までをファイルに書き込んで、そして、そのファイルから2行目までのデータを読み込むにはどうすればいいのでしょうか。

環境はvine linuxでコンパイラはgccです。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの一括読み込み・書き込み 28721 RAPT 2006/11/04 20:33:16


No.28721

Re:ファイルの一括読み込み・書き込み
投稿者---RAPT(2006/11/04 20:33:16)


何を以って「行」と表現するのかによります。
それを2行書けば良い。


この投稿にコメントする

削除パスワード

No.28733

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 01:34:37)


返信ありがとうございます。

double x[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
といった2次元配列のデータを
double y[3][3];
といった2次元配列に{1,2,3},{4,5,6}までのデータをファイルに
書き込んで、また、読み込むときは
fwrite(x, sizeof(double), 3 * 2, fp);
fread(y, sizeof(double), 3 * 2, fp);
でいいのでしょうか。

また、
fwrite(x, sizeof(double), 3 * 3, fp);
でファイルに書き込んだ後、
double y[3][3]という2次元配列yに対して(yのすべての要素は0)
fwrite(y, sizeof(double), 5, fp);
とした場合は、
y[0][0] = 1; y[0][1] = 2; y[0][2] = 3;
y[1][0] = 4; y[1][1] = 5; y[1][2] = 0;
y[2][0] = 0; y[2][1] = 0; y[2][2] = 0;
とyに書き込まれたと思っていいのでしょうか。(つまり、5個目までのデータが書き込まれた。)


この投稿にコメントする

削除パスワード

No.28737

Re:ファイルの一括読み込み・書き込み
投稿者---RAPT(2006/11/05 01:52:53)


逆に、どういった構造で書き込みたいのか、を書いて欲しかった。
そのコードの結果を知りたいだけならやってみればよい。
ファイルに出力して、バイナリエディタで見れば一目瞭然。


この投稿にコメントする

削除パスワード

No.28740

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 02:06:15)


>逆に、どういった構造で書き込みたいのか、を書いて欲しかった。
>そのコードの結果を知りたいだけならやってみればよい。
>ファイルに出力して、バイナリエディタで見れば一目瞭然。
すみません。このようなコードで実際にあっているかを確かめたかったの
とどうしてこのコードでいいのかを知りたかったのです。

freadやfwrite関数の形式は
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
であるので、多次元配列の時はptrがどのようになっているのかを知りたかったのです。


この投稿にコメントする

削除パスワード

No.28748

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 15:39:40)


返信ありがとうございます。

すいません間違えていました。
2つ目のfwriteはfreadでした。
この場合は、2次元配列yに書き込まれた情報は
以下のようになっていると思っていいのでしょうか。
つまり、ファイルにはfwriteでxのすべての要素が、
x[0][0],x[0][1]...,x[2][1],x[2][2]と順に書き込まれて
freadではyの5つまでの要素、つまり、
y[0][0],y[0][1]...,y[1][1]まで書き込まれた言うことでしょうか。

以下は前の文章の訂正です。

fwrite(x, sizeof(double), 3 * 3, fp);
でファイルに書き込んだ後、
double y[3][3]という2次元配列yに対して(yのすべての要素は0)
fread(y, sizeof(double), 5, fp);
とした場合は、
y[0][0] = 1; y[0][1] = 2; y[0][2] = 3;
y[1][0] = 4; y[1][1] = 5; y[1][2] = 0;
y[2][0] = 0; y[2][1] = 0; y[2][2] = 0;
とyに書き込まれたと思っていいのでしょうか。(つまり、5個目までのデータが書き込まれた。)


この投稿にコメントする

削除パスワード

No.28750

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 17:05:11)


プログラムの

プログラムの実行をしてみました。
確かに、2次元配列yに5個のデータが書き込まれていました。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
なのですが、void *ptrについては2次元配列yを入れた場合どのようになっていると思えばいいのでしょうか。
一次元配列の時は*ptrなのでわかるのですが、2次元配列の場合がどのようになっているのかがよくわかりません。


この投稿にコメントする

削除パスワード

No.28752

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 18:08:09)


解説ありがとうございます。

2次元配列yを渡した時、yの要素に(0,0),(0,1),(0,2)...(2,0),(2,1),(2,2)
といった順番でデータが記録されていくのですね。だから、double型で
5個のデータを読んだときは(0,0),(0,1),....,(1,0),(1,1)とデータが入っていくのですね。
よくわかりました。

あと、3次元配列のときも同様なのでしょうか。


この投稿にコメントする

削除パスワード

No.28754

Re:ファイルの一括読み込み・書き込み
投稿者---atomic(2006/11/05 18:37:26)


>>あと、3次元配列のときも同様なのでしょうか。
>
>No.28751で、2次元「以上」と書きました。

すみません。見落としていました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧