改行について

解決


遊羅  2008-03-06 00:31:27  No: 67746

VC++初心者です。
エディットボックスに入力された文字をテキストに保存するということをやっています。
保存は出来たのですが、改行が多く入ってしまいます。
これを取り除く方法はあるのでしょうか?


123
abc
987

とエディットボックスに入力
テキストを呼び出すと

123

abc

987

となってしまっています。
どうぞ、ご教授のほどよろしくお願いいたします。


Blue  2008-03-06 00:39:22  No: 67747

どのように保存していますか?

エディットボックス上では \r\n で改行を持っているので、
fopenでテキストモードで開いたものや、CStdioFileでtypeTextで開いたものに
書き込むと、 \r\n → \r\r\n  としてしまいます。


遊羅  2008-03-06 00:59:08  No: 67748

Blueさん
さっそくのお返事ありがとうございます。
Blueさんの言うように、fopenで開いています。

以下、ソースです。

FILE *stream;
char buf[300]={0};
char file[MAX_PATH]={0};
CString str;

GetDlgItemText(IDC_EDIT2, file, MAX_PATH);
CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT1);
GetDlgItemText(IDC_EDIT1,str);

//ファイルを書込みようにオープン
stream = fopen( file, "w" );

fputs(str, stream);
strcat(file,str);

fclose(stream);

SetDlgItemText(IDC_EDIT1, str);
}

\r\n → \r\r\n となっていると思います。
回避方法はありますでしょうか?
ぶしつけな質問ですが、よろしくお願いいたします。


Blue  2008-03-06 01:04:49  No: 67749

1.\rを消したものを保存する。
2.バイナリモードで保存する。
のどちらかで回避できるでしょう。


遊羅  2008-03-06 01:16:23  No: 67750

Blueさん
お返事ありがとうございます。

>1.\rを消したものを保存する。
という方法がわからなかったので

>2.バイナリモードで保存する。
を試しましたら、無事出来ました。

しかし、保存したファイルを表示してそれをそのまま保存すると、同じように改行が表示されてしまいます。
また質問で返して申し訳ないのですが、これを回避する方法はありますか?
よろしくお願いいたします。


Blue  2008-03-06 01:29:58  No: 67751

1はCStringのReplaceメソッドを使えばいいです。

テキストファイルはどうやって表示していますか?


遊羅  2008-03-06 01:39:47  No: 67752

Blueさん
お返事ありがとうございます。

>1はCStringのReplaceメソッドを使えばいいです。
ありがとうございます。
まだ、勉強中ですが、使い方を調べてみます。

>テキストファイルはどうやって表示していますか?
以下のように、表示させています。

説明不足で申し訳ありません。
表示は表示用のボタン、保存は保存用のボタンがあります。
こちらは、表示のみのプログラムです。

FILE *stream;
char line[100];
char buf[300]={0};
char file[MAX_PATH]={0};

GetDlgItemText(IDC_EDIT2, file, MAX_PATH);
if(strlen(file) == 0)
  {
    AfxMessageBox("ファイル名を入力してください。\n");
    return;
  }
  if( (stream = fopen( file, "r" )) != NULL )
  {
    while(fgets( line, 100, stream ) != NULL)
  {
    strcat(buf, line);
    strcat(buf, "\r\n");
  }
  SetDlgItemText(IDC_EDIT1, buf);
  fclose(stream);
  }
  else
  {
    AfxMessageBox( "fopen 関数でエラーが生じました。\n");
  }
}

おかしなところがあれば、ご指摘をお願いいたします。


夏みかん  2008-03-06 01:49:38  No: 67753

fgets関数は改行コードを読み込みます。
"r"でオープンしているので改行が\nです。
この\nの末尾にstrcatで\r\nを追加しているのでおかしくなるのです。
つける必要はないがテキストボックスにセットするとおかしくなるよ。

"rb"でオープンすれば改行コードが\r\nとなりエディットボックスの
改行表現と一致するのでそのまま使えばいい。


Blue  2008-03-06 01:50:24  No: 67754

読み込み時にテキストモードで読み込むのがまずいのかも。
1の方法ならここを考えなくてもいいのですけど。

読込みも保存もバイナリモードで保存する。

とするとどうでしょうか?


遊羅  2008-03-06 02:05:22  No: 67755

夏みかんさん、Blueさん
お返事ありがとうございました。

夏みかんさん
>fgets関数は改行コードを読み込みます。
おっしゃるとおりでした。
よくよく調べてみたら、ちゃんと書いてありました。
すみません・・・。

Blueさん
>1の方法ならここを考えなくてもいいのですけど。
そうなのですか!
まだ、始めたばかりで、どうしても関数やメソッドを多用できないので、これから勉強して、使った方法でも作ってみます。

夏みかんさんとBlueさんのご指摘通り、表示もバイナリーモードにしました。
そして
strcat(buf, "\r\n");
この一行をコメントアウトしたら、保存と表示が一致するようになりました。
すばやいお返事と、わかりやすい解説をありがとうございました。

くだらない質問ですみませんでした。
お相手してくださったBlueさん、夏みかんさん、ありがとうございました。
もう少し、勉強しないと駄目ですね・・・。

またお世話になるかとは思いますが、その時はよろしくお願いいたします。

動くようになりましたので、解決とさせていただきます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加