- ベストアンサー
CStringについて
よろしくお願い致します。 CString型の文字の最後の1文字を’¥0’に変更するにはどうすれば良いのでしょうか? CStringのことが良く分かっていないので、質問の仕方が変かも知れませんがお教えください。 今は仕方なしに、こんな感じでやってます。 CString m_InputData; char moji[100]; int n; strcpy(moji,m_InputData); n=strlen(moji); moji[n-1]='\0' m_InputData=moji;
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
最後の1文字を削除したいということでしょうか? m_InputData.Delete(m_InputData.GetLength() - 1); # 最後の1文字が漢字とかだとまずいですが。
その他の回答 (7)
- ShaneOMac
- ベストアンサー率39% (356/898)
やりたいことはともかくとしてCStringを使っているのにメンバ関数を活かしてないような気がしますが。CStringは文字列を扱うのに非常に便利ですからいくつか関数を覚えて使うようにすると良いと思います。 特定文字を置き換えるならこの場合はGetLength()で-2でも良いのかもしれませんが、Find()かReverseFind()あるいはFindOneOf()で見つけてSetAt()で置き換えるとか。 見つけた部分から前だけを抽出するならFind()で取ったnCountを使ってLeft()で抽出、=で代入するとか。 文字数を削るなら\0代入でなく、Mid()で割って=で代入するとか。 ホワイトスペース(空白、改行、タブ)を取り除くならTrimRight()を使うとか。
お礼
回答ありがとうございます。
- minimum
- ベストアンサー率46% (6/13)
要はLFをCRLFに変換したいということですよね 変換は出来たみたいですが、一つ確認していただきたい その読み込んでいるファイルの改行コードはLFなのですか? Windows環境で使われるテキストファイルはCRLFが標準です。 しかしCでは伝統的に改行コードはLFなので、 WindowsのCにはCRLFをLFに変換して読み込む 「テキストモード」というのがあります。 テキストモードで読み込んでいませんか? もしそうなら、何も変換せずに読み込む 「バイナリモード」でファイルをオープンすれば うまくいくのではないでしょうか fopenなら"r"ではなく"rb"を指定 CFileならCFile::typeBinaryを指定すればいいのかな? (MFCはよく知らない)
お礼
回答ありがとうございます。
- MovingWalk
- ベストアンサー率43% (2233/5098)
mydata1[n-1]='\0'; はfgets()の末尾の'\n'をカットするものですよね。 (厳密には'\n'かどうかの検査をすべきと思います) http://www.bohyoh.com/CandCPP/C/Library/fgets.html >空の1行を削除するために今回の処理をしています 取得した文字列に改行コードを付加しているので、最後は改行で終わりますね。 これでいかがでしょうか? for(i=0;;i++){ fgets(mydata1,256,fin); n=strlen(mydata1); if(mydata1[n-1]=='\n') mydata1[n-1]='\0'; if(strcmp(mydata1,"end")){ if(i==0) m_InputData=mydata1; else m_InputData=m_InputData+crlf+mydata1; } 略 }
お礼
回答ありがとうございます。 今日は疲れているのでもう寝ます。 (朝型タイプなのですみません) 教えていただいたことは明日また確認して連絡させていただきます。 一応、CStingでのコードは#5の補足に書いた方法でうまく行きました。 結果がうまくいっただけで、細かい分かっていない部分は勉強したいと思います。
補足
回答ありがとうございます。 教えて頂いたコードは理解できました。 しかしながら、実際にはテキストファイルに書き込むときに特殊な処理をしているため、教えていただいたコードではエディットボックスに表示するとゴミが付きます。 あああ いいい・・ ←ゴミの数は適当 それで結局 moji[n-2]='\0' というおかしな処理が必要になりました。 MovingWalkさんのコードの考え方は、今後の参考にさせて頂きたいと思います。 また、最初の質問に戻って、今回知りたかったCStringでの処理の仕方については、yoppiiさんに教えて頂いたことで解決です。 今回の質問はこれで解決、終了にさせて頂きたいと思います。 #今回の質問の内容より前に行っているテキストファイルに書き込む処理を私自身が正確に理解出来ていない為、適確な質問が出来ず申し訳ありませんでした。 自分自身で調べて分からなければ、改めて質問します。 ちなみに、テキストファイルに書き込む時に以下のような感じで処理しています。 aaaa=aaaa+bb+"\x0a"+aaa+"\x0d\x0a"+"end"+crlf;
#3 のコードで「サンプルプログラムと同じ処理」 が出来るのですが。だめですか? > 正確には最後から2文字以降を削除したいのですが、 もう一度やりたいことを確認したいのですが, "ABCDE" が "ABC" になればいいのでしょうか? 日本語の扱いはどうしましょうか? 考慮しなくてもいいですか? それとも, "あいうえお" が "あいう" になって欲しいですか?
お礼
回答ありがとうございます。 適確に疑問点を質問できず、気を使わせて申し訳ありません。 #4のお礼欄にもう少し詳しく質問内容を書いておきました。 これでお分かりでしたら、よろしくお願い致します。
補足
参考サイトを調べてようやく出来ました。 m_InputData.Insert(m_InputData.GetLength() - 2, '\0');で同じことが実現でき、実行結果もうまくいきました。
- MovingWalk
- ベストアンサー率43% (2233/5098)
>サンプルプログラムと同じことが出来れば良いです 何のためにサンプルプログラムのようなことが必要なのかをお聞きして いるんです。サンプルプログラムのままがよければそれでいいはずです。 moji[n-1]='\0' C文字列の最後の文字を消すってことですよね。 こうすれば、 「CString型の文字の最後の1文字を’¥0’に変更する」 ことになるんですか?(文字サイズが小さくなることとは意味が少し違います)
お礼
回答ありがとうございます。 >何のためにサンプルプログラムのようなことが必要なのかをお聞きしているんです。 うまく説明できませんがご容赦ください。 <仕様> 1.テキストファイルから1行づつ読み込む。 2.読み込んだ文字列をエディットボックスに改行して表示できるように、1行読み込む毎に"\x0a"を追加しました。 while(1){ fgets(mydata1,256,fin); n=strlen(mydata1); mydata1[n-1]='\0'; if(strcmp(mydata1,"end")){ m_InputData=m_InputData+mydata1+crlf; } 略 3.実行してみると、最終行にだけゴミ・が付きました。 あああ いいい・ 4.そのゴミを取るために、次のようにしました。 CString m_InputData; char moji[100]; int n; strcpy(moji,m_InputData); n=strlen(moji); moji[n-2]='\0' //■n-2です m_InputData=moji; >サンプルプログラムのままがよければそれでいいはずです。 もう少しスマートな書き方があるんじゃないかと思いお聞きしました。 これでお分かりでしょうか? よろしくお願い致します。
補足
すみません。1部訂正です。 <誤り> あああ いいい・ <訂正> あああ いいい ←空の1行が入る | ←カーソルの位置 空の1行を削除するために今回の処理をしています。
- MovingWalk
- ベストアンサー率43% (2233/5098)
結局何をしようとしているのかわかりませんが、 こちらを参考にしてみてはいかがでしょうか。 http://www.microsoft.com/japan/developer/library/vccore/_core_strings.3a_.cstring_operations_relating_to_c.2d.style_strings.htm
お礼
回答ありがとうございます。 >結局何をしようとしているのかわかりませんが、 質問が仕方がまずいようですが、勘弁ください。 サンプルプログラムと同じことが出来れば良いです。 よろしくいお願い致します。
'\0'は文字列の終わりを意味するコードなので、「文字」ではありませんし、文字列の一部として扱うことはできません。 CString型では内部で自動的に文字列の最後に'\0'が付加されています。 ご質問のサンプルプログラムでは、文字列が1文字少なくなるだけです。
補足
回答ありがとうございます。 サンプルプログラムと同じ処理が出来れば良いのですが、CString特有のもっと簡単な書き方ができるのでしょうか? よろしくお願い致します。
お礼
回答ありがとうございます。 正確には最後から2文字以降を削除したいのですが、参考サイトを見てもすぐには理解できませんでした。 教えていただけると大変助かります。 どうかお願い致します。