
趣味でCの勉強をしています。
リスト構造や二分木構造のデータをテキストファイルに保存、読み込み再構成させたいです。
データ構造の要素(構造体)に別の要素を指すポインタが含まれてのですが、この情報をテキスト化する方法が有りますか?
考えたのは、各要素にID番号などユニークな記号をつけてポインタ値の代わりにそのIDをテキストに保存しておき、再構成の際にはそのIDとmallocで取得した要素のアドレスを関連つけるテーブルを作成して、テーブルの全ての要素のアドレスが決定したら、各要素内のポインタに対応するアドレスを設定するというものです。
これで問題はないと思うのですが、もっと適切な方法或いはライブラリなどありましたらご教示をお願いします。
またテキスト保存の一般的なフォーマットがありましたら併せて教えていただけると嬉しいです。
構造体の要素としては、ポインタの他に文字列(char配列)、int、doubleなどがありテキストファイルの状態で値が読み取り可能である方が良いです。
使用環境はWindows上のMingw gccです。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
シリアライズですね。
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA% …
あたりを読むと良いと思います。
JavaやC++なら色々あるみたいですが、Cだとちょっとわからないですね。
検索してみたところ、C言語向けのライブラリとしては
http://kmaebashi.com/programmer/serializer/index …
がありました。
ご回答ありがとうございました。
なるほどシリアライズというのですね、勉強になります。
ライブラリのリンクのご紹介ありがとうございました。
実を言いますと前橋さんのページは別件で良く拝見することがあるのですが、このページには気がつきませんでした。じっくり勉強させていただこうと思います。
No.4
- 回答日時:
ASN.1 という、データを色々な方法で符号化するための規格があります。
http://ja.wikipedia.org/wiki/Abstract_Syntax_Not …
しかし一般的と言えるほど認知度は広くはないですね。
手っ取り早いのは、質問者さんが考えられた方法だと思います。私の周囲でもほぼ同じ実装方法をとっています。新しいファイル形式を決めると、よくテキストでもバイナリでも保存できるようにしています。
リスト構造の場合は各要素に0から順に番号を振り、ポインタをこの番号に置き換えてます。
(配列で作った二分木のような)隙間のある疎なデータ構造では、保存するファイルから無駄を無くすため、やはり変換テーブルを用意しています。要素はいったん配列に詰め込んで0から順に番号を振り、変換テーブルに番号と本来の位置の対応を記録しています。
これで問題はないでしょう。
ご回答ありがとうございました。
自分の考えたものと同じような方法をとられているとのご回答をいただけて、ホッとしております。
ASN.1のご紹介ありがとうございました。
いろいろと新しい知識を得ることができて参考になります。
No.3
- 回答日時:
因みに、要素を減らす場合は、メモリの再確保はしないで、構造体内に使用中かどうかを示すメンバを用意し、それを「未使用」にすれば良い(要素を増やす時に未使用になっている物を再利用しても良い)
構造体内のメンバ変数の「要素番号」に意味があるので「未使用になって空いた隙間を詰める」と言う処理はできない。
No.2
- 回答日時:
構造体を配列化すればよい。
配列化すれば、ポインタの変わりに要素番号を使える。
//構造体定義
typedef struct hogehoge {
int parent; //親の番号
int right; //右の子の番号
int left; //左の子の番号
//以下、中身省略
} ListData;
//構造体のポインタ宣言。使用時は配列参照する
ListData *array_struct = NULL;
ListData *new_array_struct;
ListData *new_struct;
int array_size = 0;
//要素を1つ増やす
new_array_struct = realloc(array_struct,sizeof(ListData[1]) * ++array_size);
if (new_array_struct) {
//メモリ確保に成功したら
array_struct = new_array_struct;
new_struct = &array_struct[array_size - 1]; //新しく増えた要素
//新しく増えた要素を初期化
new_struct->parent = -1;
new_struct->right = -1;
new_struct->left = -1;
} else {
//メモリ確保に失敗したらメモリ開放して異常終了
free(array_struct);
abort_exit("memory alloc error");
}
二分木データの配列array_structで、自分自身が0番、右の子が2番、左の子が5番ならば、array_struct[0].rightが2、arraystruct[0].leftが5となり、array_struct[2].parentとarray_struct[5].parentが0になる。
親が居なければparentが-1、左右の子が居なければrightやleftが-1になっていれば良い。
右の子のデータを参照するなら「array_struct[array_struct[自分の番号].right].構造体メンバ変数」で参照できる。
テキストに出力する場合は「要素番号をそのままテキスト出力」するだけ。
テキストから入力する場合は「テキスト入力してそのまま要素番号を格納」するだけ。
変換テーブルなんぞ必要ない。
ご回答ありがとうございました。
ポインタの代わりに配列にするというのは盲点でした。
ただreallocというのは、そのたびに全部のデータをコピーするのですよね。
データ構築時の時間ロスが気になりますが、大規模でなければ問題ないのかな?
No.1
- 回答日時:
テキストファイルで構造的なデータを保存するライブラリと言われると、
すぐ思いつくのはXMLですね。
ライブラリもたくさんあります。
> 構造体の要素としては、ポインタの他に文字列(char配列)、int、doubleなどがあり
これらが保持出来ればテキストには拘らない、と解釈すると
SQLなんかも視野に入ってくると思います。
私自身はSqliteとMysqlをC言語からコールしたことがあります。
2分木でもSQLで表現できますよ。
> またテキスト保存の一般的なフォーマットがありましたら併せて教えていただけると嬉しいです。
CSV、XMLあたりじゃないでしょうか。
ほかは私は知りません、すみません。
ご回答ありがとうございました。
SQLについては、ほんの少しかじった程度でしたので、二分木構造を表現できるとは知りませんでした。
参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- JavaScript 階層別の組織図の自動作成について 1 2022/10/26 13:42
- JavaScript Q&Aの掲示板を作成していてヤフー知恵袋やgoo質問のように質問ごとにURLを生成したい 5 2023/08/04 01:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の要素番号を取得するには?
-
Vba 配列の中の特定文字列の位...
-
配列操作
-
[Objective-c]多次元配列のアク...
-
VB.NET の配列の要素数
-
画面上にランダムでムービーク...
-
アクションスクリプト for~in時
-
重複しない乱数の生成
-
データ構造のテキスト保存につ...
-
【ActionScript】配列の昇順降...
-
二次元配列のちょっと複雑な操作
-
乱数での確率
-
エラー(型が一致しません。)...
-
c++ cmathとmath.h
-
VB6でユーザー定義型がNothing...
-
プログラム開始から 2秒毎に ...
-
#define 文
-
TextChangeイベントが発生しない
-
この問題で質問です。 Javaです...
-
アクティブなウィンドウのみ、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET の配列の要素数
-
変な質問ですみません、n番目の...
-
VBでボタンを押すと画像をラン...
-
配列の要素番号を取得するには?
-
IDの自動採番について
-
DataGridでCTRLキーを押さずに...
-
Vba 配列の中の特定文字列の位...
-
複数の変数宣言を、for文で一気...
-
VB6 複数行のテキストをリスト...
-
arrayの中から一番近くて大きい...
-
動的に多次元配列を使用したい
-
重複しない乱数を作り配列に入...
-
phpからas3へ配列の渡し方を教...
-
絵を描き、その都度のxy座標を...
-
重複しない乱数の生成
-
ヒープソートの問題について
-
文字列にある数字を判別するに...
-
データ構造のテキスト保存につ...
-
ランダムに6つの数字を選びその...
-
入力されたテキストを変換したい
おすすめ情報