アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いいたします。
環境 WIN98 VC++6.0 MFC にて

改行が可能なエディットボックスのデータをテキストファイルに保存すると、エディットボックスと同様に改行されて保存されます。

ファイルからデータを読出し、エディットボックスに表示する場合もちゃんと改行されていて問題ありません。

ここで、エディットボックスが2つあり、それぞれのエディットボックスのデータが2行あったとすると、ファイルには4行保存されます。

次にファイルからデータを読出し、エディットボックスに表示する場合、1個目のエディットボックスのデータが2行と分かっていれば良いのですが、そうでない場合は何行読み出してエディットボックスに表示すれば良いか分かりません。

そこで、1個目のデータを保存する時に、最終行の次の行にendという文字を保存することにしました。

これで、読み出すときはendを目印に必要な行数を読み出せます。

しかしながら、エディットボックスの文字の中にたまたまendが使われるとうまく行きません。

長くなりましたが、このような場合、一般的にはどのようにして対処すれば良いのでしょうか?

お分かりの方よろしくお願いいたします。

A 回答 (10件)

たとえば:



- ふたつのデータの区切りを'%'とする
- データ内にある'%'は"%%"に変換する(読むとき逆変換)

> 一般的にはどのようにして対処すれば良いのでしょうか?

何をもって'一般的'とするのか定かではありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

回答に対し、いろいろ疑問が沸いてきましたので質問させてください。
決して天邪鬼的に反論しているわけではないので、機嫌を害さないでください。お願いいたします。

>- ふたつのデータの区切りを'%'とする
>- データ内にある'%'は"%%"に変換する(読むとき逆変換)
ということは、文字を1字づつチェックするということですよね。
コンピュータにとってはたいしたことないのかも知れませんが、なんか大変そうですね。
また、実際のデータに%が含まれていたら不具合が発生するのではないでしょうか?

> 何をもって'一般的'とするのか定かではありません。
epistemeさんのような専門家の方だったらどうするか?という風に読み替えていただけたらと思います。

#素人なのでトンチンカンなことを書いてしまったかも(^^ゞ

お礼日時:2003/09/09 16:36

デリミタで使う 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関数でもって
デリミタを探せばいいのでは?(^^;。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2003/09/10 12:24

no.5です。



>データに</string1>が含まれていたら
>どうなるのでしょうか?

 "<"を、"&lt;"に、">"を、"%gt;"に変換します。
「データに&lt;/string1&gt;が含まれていたら」

 文字列の変換は、epistemeさんがおっしゃるとおり、それ専用のライブラリがあるので全く問題ありません。面倒ですが、はき出されたファイルを見て、なんのデータかがわかるというメリットがあります。「XML"風"」


 CSVっていう手があるじゃないか。。。

項目はカンマで区切る,ダブルクォーテーションは2つ""に置き換える,"カンマ,や改行
を含む時は、ダブルクォーテーションで囲む"
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

データに&lt;/string1&gt;という1行があったらうまく行かないと思うのですが。。。。
(実際にはそんなことないとおもうけど)

お礼日時:2003/09/10 08:40

#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とすることが出来ますよね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

デリミタというのは、バイナリの場合しか使えないのでしょうか?

テキストデータで”0x1c”としてみましたが、当然のことながら、データ本文に”0x1c”があるときは、うまく行きませんでした。

お礼日時:2003/09/10 08:31

Re#3:


> ということは、文字を1字づつチェックするということですよね。
> コンピュータにとってはたいしたことないのかも知れませんが、なんか大変そうですね。

いいえちっとも。文字列の中から特定の文字を見つける関数がありますから。

> また、実際のデータに%が含まれていたら不具合が発生するのではないでしょうか?

その不具合が発生しないように、"%"を"%%"に変換するのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>いいえちっとも。文字列の中から特定の文字を見つける関数がありますから。

やっぱりそうですか。これは問題無さそうですね。

>その不具合が発生しないように、"%"を"%%"に変換するのです。
間違えました。(^^ゞ
%%が含まれていたらどうなるのでしょうか?でした。

%%のばあいは%%%%にして、読み出すときは%%に戻す。
おやおやおや???うまくいきそうな気がする。

%の次の文字が%でなかったら区切りの%と判断するということですよね。
ということは、%でなくて’あ’でも良いということですよね。
当然実際には出現回数の少ない文字にすべきですけど。

#ところで最近”恵比寿帝冥”と名乗っている人がいますけど、当然別人ですよね。
この人も考えたな~。

お礼日時:2003/09/09 17:11

#5 ; テキストボックスに </string1> と書かれたらアウトですが...それを考慮すると余計に面倒。

    • good
    • 0

<string1>


テキストボックス1の内容
もちろん改行もOK
</string1>
<string2>
テキストボックス2の内容
一緒にならないよ
</string2>
~~~~~
XML風・・・如何?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

データに</string1> が含まれていたらどうなるのでしょうか?

<string1>
テキストボックス1の内容 に</string1>がある
もちろん改行もOK
</string1>

お礼日時:2003/09/09 16:48

えぇ~と…申し分けないのですが、


行数を知る必要は別にないのでは?(^^;
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。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

知りたいことは、2つのエディットボックスのデータをファイルに保存し、次に保存したデータを読出して、また2つのエディットボックスに表示する。ということなのですが、回答頂いたことは読み出したデータを1つのエディットボックスに表示するということではないのでしょうか?

勘違いでしたらすみません。

お礼日時:2003/09/09 16:42

>そこで、1個目のデータを保存する時に、最終行の次の行に


>endという文字を保存することにしました。

もっと複雑な記号を混ぜた文字列にするとか。

さらに極端にするんだったらNULLを最後につけるとか。
ここまでするとテキストファイルじゃなくなりますが、
アプリのデータ管理用という位置付けで他の人に編集させないのであれば、ありです。

あとは、1つのエディットについて、ファイルを1つ作成する。
で、そのファイルの名前を管理するファイルを作成しておくとか。
    • good
    • 0
この回答へのお礼

こんにちは 久しぶりな感じがします。

>もっと複雑な記号を混ぜた文字列にするとか。
この案は考えましたが、確立の問題とは言えバグの原因になるんじゃないかと思いました。

>さらに極端にするんだったらNULLを最後につけるとか。
これいいですね。と思いやってみました。

endの場合はこれでうまくいっています。

CString aaaa="";
sprintf(aaa,"%s",pDlg->m_moji);
aaaa=aaaa++aaa+crlf+"end"+crlf;

今度は”end”を”¥0”に変えました。
するとテキストボックスに表示した場合、”いいい”のあとに”・”が付いて表示されしまいます。

あああ
いいい・

>あとは、1つのエディットについて、ファイルを1つ作成する。
>で、そのファイルの名前を管理するファイルを作成しておくとか。
ここまでやらないと出来ないのでしょうか?

もっと簡単な方法はないでしょうか?
質問のendのことは忘れて、テキストボックス毎にデータ保存、呼び出しを行う良い方法はないでしょうか?

お礼日時:2003/09/09 16:23

1個目のデータと、2個目のデータの先頭に、


それぞれのデータのレングス(バイト数)+改行とかを
入れとけばいいんじゃないでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほどそうですね。
と思ったのもつかの間、fgetsで1行づつ読むことしか知りません。

あるバイト数だけ複数行に渡って読み込むには、どうすれば良いのでしょうか?

よろしくお願いいたします。

お礼日時:2003/09/09 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!