保存すると「・」が入ってしまうので表示させないためには?

解決


ロム—  2006-04-24 16:33:56  No: 61387  IP: 192.*.*.*

「テキストを変更しないでそのまま表示させるには?」
の続きになってしまうんですけど
ファイルを保存したときにテキストの改行(リターン)した場所の後ろに
「・」が入って保存されてしまうんですけど
いくら考えてもわからないのでどなたか考えられる事を
あげてもらえないでしょうか?

編集 削除
ジョナ・ロムー  2006-04-24 16:41:32  No: 61388  IP: 192.*.*.*

インターネットでも探してみましたか?

できる限りの努力をした方が後々自分が得しますよ。

編集 削除
ロム—  2006-04-24 16:44:37  No: 61389  IP: 192.*.*.*

インターネットでももちろん検索しましたが、
どうしてもわからなかったのでヒントだけでもいただけないでしょうか?

編集 削除
ラグビーオタク  2006-04-24 16:48:40  No: 61390  IP: 192.*.*.*

あきらめたらそこでノーサイドです!
ガンバって自分の力で新たな知識を身に付けるのだ!

編集 削除
Blue  2006-04-24 16:53:00  No: 61391  IP: 192.*.*.*

とりあえず、どのようにして保存しているかコードを載せたほうが良いです。

バイナリで保存すれば大丈夫なはずだが。。。

編集 削除
ロム—  2006-04-24 16:59:35  No: 61392  IP: 192.*.*.*

コードは以下の通りです。どの部分のコードを記入すればよいのか
わからなかったので全部のせました。長くてすみません。

void CVCKadaiDlg::OnRead() 
{
    UpdateData(TRUE);
        
    char c[256];
    CStdioFile fpi;
    if(fpi.Open(m_path_read, CFile::modeRead) != 0)
    {
                m_text = "";
        while(fpi.ReadString(c,256) != NULL)
        {
            c[strlen(c)-1] = 0;
            m_text+= c;
            m_text+="\r\n";
        }
    }

    UpdateData(FALSE);      
}

void CVCKadaiDlg::OnWrite() 
{
        int ret;
    UpdateData(TRUE);

    CStdioFile fpo;
    if(fpo.Open(m_path_write, CFile::modeCreate | CFile::modeWrite) != 0)
    {
                if(m_path_read == m_path_write)
                {
                        ret = AfxMessageBox("このファイルは既に存在します。上書き保存しますか?",MB_YESNO);
                        if(ret == IDYES){
                                fpo.WriteString(m_text);
                        }
                }
                else fpo.WriteString(m_text);
    }
}

void CVCKadaiDlg::OnReadRef() 
{
        UpdateData(TRUE);

    CFileDialog fdlg(TRUE,"txt",NULL,OFN_ALLOWMULTISELECT|OFN_LONGNAMES, "txt file|*.txt||",this);
    if(fdlg.DoModal()==IDOK)
    {
                m_path_read = fdlg.GetPathName();
        UpdateData(FALSE);
    }       
}

void CVCKadaiDlg::OnWriteRef() 
{

        UpdateData(TRUE);

    CFileDialog fdlg(FALSE,"txt",NULL,NULL,"txt file|*.txt||",this);
    if(fdlg.DoModal()==IDOK)
    {
                m_path_write = fdlg.GetPathName();
                UpdateData(FALSE);
        }
}

バイナリって言うのもわからないので説明をお願いできますか?

編集 削除
kure  2006-04-24 17:05:42  No: 61393  IP: 192.*.*.*

> いくら考えてもわからないのでどなたか

こういったケースは大抵着眼点がずれてるだけって
パターンが多いような気がします。
ロジック組むためにはこの辺のセンスというか
直感的なものって大事だと思うんですよね。
(だからどうしたってわけではないんですけどね^^;)

ロムーさん、次の質問に答えてみてください。

あなたは蛇口からコップに水を汲もうとしています。
水を汲んだらコップから水をあふれさせてしまいました。
その原因はなんでしょうか?
(蛇口はあなた自身がひねり、
水を汲み終わるまで蛇口の前にいるという設定です)

答えをお待ちしております。

#先に誰かが答えを教えてくれてもこの質問には答えて欲しいです。
#考え方を身に着けるのも大事なことなので。

編集 削除
Blue  2006-04-24 17:06:55  No: 61394  IP: 192.*.*.*

CStdioFileを使って、WriteStringで保存すると、
>             m_text+="\r\n";
で設定した改行コードが勝手に

\r\r\n と変換されます。
なので、保存前に \r\n を \n に変換する必要があります。

m_text.Replace( "\r\n", "\n" );

みたいに。


それ以外の方法は、CStdioFileクラスを使わずに、CFileクラスのWriteメソッドを使って書き込むのがあります。

CFile fpo;
// オープンとかはほとんど同じ
〜  省略  〜
fpo.Write( m_text, m_text.GetLength() );

編集 削除
ロム—  2006-04-24 17:09:08  No: 61395  IP: 192.*.*.*

>その原因はなんでしょうか?
ゴキブリが出てきて気が動転した。
みたいな答えで大丈夫でしょうか?

編集 削除
Blue  2006-04-24 17:09:18  No: 61396  IP: 192.*.*.*

> m_text.Replace( "\r\n", "\n" );
これまずいか。
別バッファにコピーしてから置換してください。

編集 削除
ロム—  2006-04-24 17:24:06  No: 61397  IP: 192.*.*.*

>別バッファにコピーしてから置換してください。
やり方がわからないので、今日中にできるかわかりません。

先にご挨拶させていただきます。
Blueさんありがとうございます。
プログラムが完成できましたら再度改めてお礼をいたします。

編集 削除
ロム—  2006-04-24 17:26:20  No: 61398  IP: 192.*.*.*

kureさんへ
問題にお答えしましたけど、kureさんの見解をお願いします。

編集 削除
Blue  2006-04-24 17:31:35  No: 61399  IP: 192.*.*.*

> >別バッファにコピーしてから置換してください。
> やり方がわからないので、今日中にできるかわかりません。
CString textBuff = m_text;
textBuff.Replace( "\r\n", "\n" );// textBuff.Replace( "\r", "" ); のほうがよいかも。

CStdioFile fpo;
〜省略〜
fpo.WriteString(textBuff);
〜省略〜

編集 削除
kure  2006-04-24 17:40:31  No: 61400  IP: 192.*.*.*

> ゴキブリが出てきて気が動転した。

ぐは。
そういう不確かな事象(または想像上)の理由って
回答ってのが一番まずいですね。

プログラムってのはかならず何らかの因果関係があって、
それを的確に把握できないってのはちぃと厄介です。

で、ここでの回答としては蛇口を大きく開けすぎたとか、
水を止めるのが遅かったとかってのを期待しました。
ここで大事なのは問題に対して直接的な因果関係を持ったものが
何なのかを考えるということです。
「水があふれた」という現象であれば「水を入れすぎた」
のが原因となります。
では「水を入れすぎた」のはなぜかということを考えていけば
いつかは根本の原因にたどり着けます。

〜ここから本題〜

今回の後ろに変なデータが付くという事象の原因はなんでしょうか?
直接的な原因は
「後ろに変なデータをつけてファイルに書き込んでいる」です。
では後ろに変なデータをつけてファイルに書き込んでいる原因は
なんでしょうか?
m_textのデータがおかしいのでしょうか?
それともWriteStringの中でおかしくなっているのでしょうか?

既にBlueさんが回答をつけてくださってますので、
回答については省かせていただきます。

ぜひ一度デバッガを使うなどして自分でコードを追いかけてみてください。

編集 削除
KING・王  2006-04-24 17:41:15  No: 61401  IP: 192.*.*.*

#すこしよけいなことかもしれませんが・・・

> kure 2006/04/24(月) 17:05:42

> ロム— 2006/04/24(月) 17:26:20
> kureさんへ
> 問題にお答えしましたけど、kureさんの見解をお願いします。

掲示板はチャットではありません。
30分やそこら、返答がないからと言って、催促するのはいかがなものかと。
#恐らく、5時から一度休憩をいれて、そのときにkureさんは掲示板をみて、
#書き込みをされ、その後また、仕事をされているor帰宅されているのかと、想像できそうだが。。。

この機会に(技術系)掲示板等でのネチケットについて、学ばれておくのが今後のためにベターかと。
メーリングリストで、となっていますが、たとえば、こことか参考になるかと。
<http://www.hyuki.com/writing/techask.html>

編集 削除
kure  2006-04-24 17:43:31  No: 61402  IP: 192.*.*.*

> 問題にお答えしましたけど、kureさんの見解をお願いします。

長文になってしまいました^^;
返答遅れて申し訳ないです。

一応私の見解を述べておきましたので
後はロムーさん自身の努力次第だと思います。
(私の文章が理解しにくい場合はレスつけてください)

引き続きがんばって下さい。

編集 削除
ロム—  2006-04-24 17:57:04  No: 61403  IP: 192.*.*.*

KING・王さん忠告ありがとうございます。
これからちゃんとネチケットを学んで失礼のないよう心がけます。

kureさん見解ありがとうございます。
催促のつもりじゃなかったんですけどネチケットがなってなかったので
ご迷惑をおかけしました。
これをきっかけに私はネチケットについてもプログラムについても
もっと努力をして皆様のお役に立てるよう頑張ります。

最後にBlueさんには本当にお世話になりました。
「・」も消えて今の自分の理想の100%に達しました。
次はレベルをあげて色々なプログラムに挑戦します。

KING・王さん、kureさん、Blueさん本当にありがとうございました!

編集 削除
通りすがり  2006-04-24 18:00:50  No: 61404  IP: 192.*.*.*

>KING・王さん
リンクがおかしくなる場合が多いので、
URLの後には何もつけないほうがよろしいかと思います。
(Outlook使ってると<>で囲む癖が付いちゃいますね…)

編集 削除