- ベストアンサー
Unicodeで保存されたtxtファイルを開いて編集後Unicodeで保存する方法について
VC++.NETを使ってプログラミングをしております。 タイトルの通り、Unicodeで保存されているtxtファイルを 開いて編集後、再びUnicodeのtxtで保存したいのですが、 具体的な方法がわかりません。 普通にCFileクラスで開いて、CStringクラスで編集後、 保存して大丈夫でしょうか? サンプルプログラムが紹介されているWEBページや、方法を ご存知の方教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
MFCのCStringはUnicodeに対応しているようです。また、CFileでUnicodeのファイルを読み書きしても問題はありませんでした。 http://www.microsoft.com/japan/developer/library/vccore/_core_strings.3a_.unicode_and_multibyte_character_set_.28.mbcs.29_.support.htm CFile、CStringなど、MFCを使って処理されていますが、VC++.NETを使っているため、.NET Frameworkを使ってみるのはどうでしょうか?.NETはC#から使うのが一番ですが、C++からでも使用できます。 C++.NETでUnicodeファイルのRead/編集/Writeサンプル ------------------------------------------------------------------------------ #include "stdafx.h" #using <mscorlib.dll> using namespace System; using namespace System::IO; using namespace System::Text; int _tmain() { // Unicodeでsample.txtを読み込み StreamReader* sr = new StreamReader("sample.txt", Encoding::Unicode); String* buffer = sr->ReadToEnd(); sr->Close(); // "&"を"&"に変換 String* work = buffer->Replace("&", "&"); // Unicodeでoutput.txtに書き込み StreamWriter* sw = new StreamWriter("output.txt", Encoding::Unicode); sw->Write(work); sw->Close(); return 0; }
その他の回答 (3)
- neuron-x
- ベストアンサー率52% (139/266)
#1です。 □MFCでUNICODEを使う場合ですが、#3さんの回答が詳しいです。 (1) UNICODEを使用する宣言、または設定を行う(プロジェクトのプロパティ) (2) 型にTCHAR、LPTSTR、LPCTSTRをなどを使う。 □最初のサンプルはC++.NETを使った物です。 .NET Frameworkを使っているため、マネージドコードになります。 ちなみに、C#で同じプログラムを書くと、つぎのようになります。 using System; using System.IO; using System.Text; public class UnicodeIO { static void Main(string[] args) { // Unicodeでsample.txtを読み込み StreamReader sr = new StreamReader("sample.txt", Encoding.Unicode); string buffer = sr.ReadToEnd(); sr.Close(); // "&"を"&"に変換 string work = buffer.Replace("&", "&"); // Unicodeでoutput.txtに書き込み StreamWriter sw = new StreamWriter("output.txt", true, Encoding.Unicode); sw.Write(work); sw.Close(); } } 余談ですが、私も昔C++でMFCなどを使っていました。CStringやCFileなどMFCって便利だな~と思っていたのですが、C#を始めてからは「.NET Framework」って楽だな~と思うようになりました。C++で数十行書かないといけない処理が、C#では数行でかけてしまったりもします。(ただし、込み入った処理を書くときは今でもC++) 機会があれば、.NET FrameworkやC#についても調べてみてはいかがでしょうか?
お礼
2度の丁寧な回答ありがとうございます。 neuron-xさんのお陰で何とかなりそうです。 本当にありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
まずUNICODEにも色々な種類があることをご存知でしょうか? 一般的にWindowsのUNICODEはUCS2の事を指します。 これはWindowsXpならメモ帳で「Unicode」を指定して保存したのと同じものです。 ちなみに#1さんの方法はVC++で.net Frameworkを使った方法です。 でCString(MFC/ATL)でもUCS2を扱う事は可能なようです。 .net2003の場合ですが プロジェクトのプロパティの中に 文字セットという項目があるのでそこを「Unicode 文字セットを使用する」を選べば良いでしょう。 ところでC/C++でワイド文字を指定する場合 wchat_t str[6] = L"あいうえお"; というふうに文字リテラルの先頭にLをつけます。(vc++だけでなくgccやbccも共通) VC++でよくTCHARとかLPTSTC LPSTC LPWSTRという定義がでてきますが UNICODEが定義されていない場合 TCHAR→char LPTSTR→char* LPCTSTR→const char* LPSTR→char* LPWSTR→wchar_t* に置き換わりますがUNICODEが定義されていた場合 TCHAR→wchar_t LPTSTR→wchar_t* LPCTSTR→const wchar_t* LPSTR→char* LPWSTR→wchar_t* に置き換わります。 おまけですが tchar.hをincludeして CString A = _T("あいうえお"); とすれば UNICODE時は CString A = L"あいうえお"; そうでないときは CString A = "あいうえお"; となりUNICODEでもそうでない場合もコンパイルすることが可能になります。
お礼
回答ありがとうございます。 お陰様で疑問が解消されました。 何とかなりそうなので質問を締め切らせていただきます。 丁寧にありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
単にUnicodeといっても、ビッグエンディアンの場合もあるので、CStringで絶対大丈夫かというと、かなり微妙です。 もう少し用法の制約を厳しくするか、別の方法を考えた方がよさそうです。
お礼
回答ありがとうございます。 考慮してプログラミングします。
補足
質問者のmkmarimoです。 neuron-xさん、丁寧な回答ありがとうございます。 欲しい答えがいただけ感謝しております。 ところで、補足質問が2点あります。 申し訳ありませんが、また時間があればご教授ください。 【補足質問1】 回答2行目の参考URLの内容ですが、VC++の設定をデフォルトのままで ビルドしてもUnicodeでのファイル保存はできないということでしょうか? 内容をじっくり読んでもあまり理解できませんでした。 申し訳ありません。 【補足質問2】 記載していただいているサンプルプログラムですが、 namespaceなどがありますが、C++なのでしょうか? あまり知識がなく申し訳ないのですが、C#のサンプルかと感じます。 以上。よろしくお願いします。