よろしくお願いいたします。
環境 WIN98 VC++6.0 MFC にて
改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。
ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。
ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。
次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。
そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。
これで、読み出すときはendを目印に必要な行数を読み出せます。
しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。
長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか?
お分かりの方よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
たとえば:
- ふたつのデータの区切りを'%'とする
- データ内にある'%'は"%%"に変換する(読むとき逆変換)
> 一般的にはどのようにして対処すれば良いのでしょうか?
何をもって'一般的'とするのか定かではありません。
回答ありがとうございます。
回答に対し、いろいろ疑問が沸いてきましたので質問させてください。
決して天邪鬼的に反論しているわけではないので、機嫌を害さないでください。お願いいたします。
>- ふたつのデータの区切りを'%'とする
>- データ内にある'%'は"%%"に変換する(読むとき逆変換)
ということは、文字を1字づつチェックするということですよね。
コンピュータにとってはたいしたことないのかも知れませんが、なんか大変そうですね。
また、実際のデータに%が含まれていたら不具合が発生するのではないでしょうか?
> 何をもって'一般的'とするのか定かではありません。
epistemeさんのような専門家の方だったらどうするか?という風に読み替えていただけたらと思います。
#素人なのでトンチンカンなことを書いてしまったかも(^^ゞ
No.10
- 回答日時:
デリミタで使う FSやRS,GS,USの0x1c, 0x1d, 0x1e, 0x1fは
"0x1c"ではなく文字コードですよ。
'0'が0x30, '1'が0x31のようにASCII CODEです。
なので、"0x1c"とは別物です。
"0x1c"は 0x30 0x78 0x31 0x63になってしまいますよね?(^^;。
FS RS GS USは制御文字と呼ばれるものですので
キーボードからは入力できません。
ですので、入力された文字とかぶることはありえません。
テキストモードでの読み書きでも問題なく読み書きできますよ。
ファイル上デリミタの部分のみ文字化けを起こしますが…。
(コードが文字に対応されていないためです。)
後はstrchr でも strtok でもCSting ならFind関数でもって
デリミタを探せばいいのでは?(^^;。
No.9
- 回答日時:
no.5です。
>データに</string1>が含まれていたら
>どうなるのでしょうか?
"<"を、"<"に、">"を、"%gt;"に変換します。
「データに</string1>が含まれていたら」
文字列の変換は、epistemeさんがおっしゃるとおり、それ専用のライブラリがあるので全く問題ありません。面倒ですが、はき出されたファイルを見て、なんのデータかがわかるというメリットがあります。「XML"風"」
CSVっていう手があるじゃないか。。。
項目はカンマで区切る,ダブルクォーテーションは2つ""に置き換える,"カンマ,や改行
を含む時は、ダブルクォーテーションで囲む"
回答ありがとうございます。
データに</string1>という1行があったらうまく行かないと思うのですが。。。。
(実際にはそんなことないとおもうけど)
No.8
- 回答日時:
#4です。
すみません勘違いしていましたm(_ _)m。
んで、思いついた方法として、
#1さんのように
1)
データの先頭にエディット1のバイト数を入れておいて
CStdioFileでバイト数分を読み出す。(複改も読み込まれます)
残りのデータは全てエディット2のものとなる。
2)
俺がよくやる方法なのですが、
デリミタとして
FS(ASCII CODE 0x1c) ファイル区切り
GS(ASCII CODE 0x1D) グループ区切り
RS(ASCII CODE 0x1E) レコード区切り
US(ASCII CODE 0x1F) ユニット区切り
を入れる。
デリミタがくればエディット1の終わりがわかり、
残りをエディット2とすることが出来ますよね?
回答ありがとうございます。
デリミタというのは、バイナリの場合しか使えないのでしょうか?
テキストデータで”0x1c”としてみましたが、当然のことながら、データ本文に”0x1c”があるときは、うまく行きませんでした。
No.7
- 回答日時:
Re#3:
> ということは、文字を1字づつチェックするということですよね。
> コンピュータにとってはたいしたことないのかも知れませんが、なんか大変そうですね。
いいえちっとも。文字列の中から特定の文字を見つける関数がありますから。
> また、実際のデータに%が含まれていたら不具合が発生するのではないでしょうか?
その不具合が発生しないように、"%"を"%%"に変換するのです。
回答ありがとうございます。
>いいえちっとも。文字列の中から特定の文字を見つける関数がありますから。
やっぱりそうですか。これは問題無さそうですね。
>その不具合が発生しないように、"%"を"%%"に変換するのです。
間違えました。(^^ゞ
%%が含まれていたらどうなるのでしょうか?でした。
%%のばあいは%%%%にして、読み出すときは%%に戻す。
おやおやおや???うまくいきそうな気がする。
%の次の文字が%でなかったら区切りの%と判断するということですよね。
ということは、%でなくて’あ’でも良いということですよね。
当然実際には出現回数の少ない文字にすべきですけど。
#ところで最近”恵比寿帝冥”と名乗っている人がいますけど、当然別人ですよね。
この人も考えたな~。
No.4
- 回答日時:
えぇ~と…申し分けないのですが、
行数を知る必要は別にないのでは?(^^;
MFCを使っていいのですよね?。
CStdioFile を使えばいいのでは?
メンバ関数のReadStringは引数がchar型の場合
復改も読み込みますし
ファイル終了となるとNULLを返しますので、
ファイル終了までwhileで廻すというのはだめなのですか?
charfile_name;//ファイル名
charch_buf[1024];//読み込み用バッファ
CStringbuf;
//バイナリ読み込み用でfile_nameのファイルを開く
CStdioFilefin( file_name, CFile::modeRead | CFile::typeBinary );
//ファイルの最後まで読み込み
while(fin.ReadString(ch_buf, 1024) != NULL){
buf += ch_buf;//バッファにためていく
}
fin.Close();//ファイルを閉じる
後はSetWindowTextでeditに表示させるというのは姑息な手段なのでしょうか?(^^;
CStringを使っていますので、
余りにファイルに記載された記述量が多いときは
while内の内容を変更する必要がありますが、
大抵はこれでいけると思います…m(_ _)m。
回答ありがとうございます。
知りたいことは、2つのエディットボックスのデータをファイルに保存し、次に保存したデータを読出して、また2つのエディットボックスに表示する。ということなのですが、回答頂いたことは読み出したデータを1つのエディットボックスに表示するということではないのでしょうか?
勘違いでしたらすみません。
No.2
- 回答日時:
>そこで、1個目のデータを保存する時に、最終行の次の行に
>endという文字を保存することにしました。
もっと複雑な記号を混ぜた文字列にするとか。
さらに極端にするんだったらNULLを最後につけるとか。
ここまでするとテキストファイルじゃなくなりますが、
アプリのデータ管理用という位置付けで他の人に編集させないのであれば、ありです。
あとは、1つのエディットについて、ファイルを1つ作成する。
で、そのファイルの名前を管理するファイルを作成しておくとか。
こんにちは 久しぶりな感じがします。
>もっと複雑な記号を混ぜた文字列にするとか。
この案は考えましたが、確立の問題とは言えバグの原因になるんじゃないかと思いました。
>さらに極端にするんだったらNULLを最後につけるとか。
これいいですね。と思いやってみました。
endの場合はこれでうまくいっています。
CString aaaa="";
sprintf(aaa,"%s",pDlg->m_moji);
aaaa=aaaa++aaa+crlf+"end"+crlf;
今度は”end”を”¥0”に変えました。
するとテキストボックスに表示した場合、”いいい”のあとに”・”が付いて表示されしまいます。
あああ
いいい・
>あとは、1つのエディットについて、ファイルを1つ作成する。
>で、そのファイルの名前を管理するファイルを作成しておくとか。
ここまでやらないと出来ないのでしょうか?
もっと簡単な方法はないでしょうか?
質問のendのことは忘れて、テキストボックス毎にデータ保存、呼び出しを行う良い方法はないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
エディットボックスの入力制限について
C言語・C++・C#
-
エディットコントロールでEnter押した時の動作
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
Microsoft VBAで2GBを超えるフ...
-
FTPでエクセルをPUTするとファ...
-
バイナリファイルの比較につい...
-
RandomAccessFile文字列の上書き
-
デバイスファイルに書き込むこと
-
VBA バイナリ―から文字列にす...
-
EOF
-
ページ読み込み時に自動的にsub...
-
MacからWinにファイルを添付す...
-
バイナリ形式のXMLファイルを読...
-
bitmap画像の保存がうまくいき...
-
EACのログファイルについて
-
4階調BMPファイルの構成
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
フルパスから最後のディレクト...
-
windows.hがincludeされない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
入力ファイルをバイナリにする利点
-
エラー:ストリームの終わりを...
-
ページ読み込み時に自動的にsub...
-
エクセルVBA 2千万行のCSVファ...
-
EOF
-
【python】Excelファイルを読み...
-
Microsoft VBAで2GBを超えるフ...
-
MacからWinにファイルを添付す...
-
VBA バイナリ―から文字列にす...
-
テキストデータをSQLServerに取...
-
PHPのfgetcsvの処理容量について
-
HDDのバイナリイメージの取得方...
-
テキストデータをバイナリデー...
-
C言語でBMPファイルの内容を表...
-
【MFC】CFileでSeekした位置か...
-
C言語とシリアル通信の送受信...
-
バイナリファイルの検索について
-
VBでCSVファイルを読み込む方法...
おすすめ情報