• ベストアンサー

Unicodeで保存されたtxtファイルを開いて編集後Unicodeで保存する方法について

VC++.NETを使ってプログラミングをしております。 タイトルの通り、Unicodeで保存されているtxtファイルを 開いて編集後、再びUnicodeのtxtで保存したいのですが、 具体的な方法がわかりません。 普通にCFileクラスで開いて、CStringクラスで編集後、 保存して大丈夫でしょうか? サンプルプログラムが紹介されているWEBページや、方法を ご存知の方教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.1

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();   // "&"を"&amp;"に変換   String* work = buffer->Replace("&", "&amp;");   // Unicodeでoutput.txtに書き込み   StreamWriter* sw = new StreamWriter("output.txt", Encoding::Unicode);   sw->Write(work);   sw->Close();   return 0; }

mkmarimo
質問者

補足

質問者のmkmarimoです。 neuron-xさん、丁寧な回答ありがとうございます。 欲しい答えがいただけ感謝しております。 ところで、補足質問が2点あります。 申し訳ありませんが、また時間があればご教授ください。 【補足質問1】 回答2行目の参考URLの内容ですが、VC++の設定をデフォルトのままで ビルドしてもUnicodeでのファイル保存はできないということでしょうか? 内容をじっくり読んでもあまり理解できませんでした。 申し訳ありません。 【補足質問2】 記載していただいているサンプルプログラムですが、 namespaceなどがありますが、C++なのでしょうか? あまり知識がなく申し訳ないのですが、C#のサンプルかと感じます。 以上。よろしくお願いします。

その他の回答 (3)

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.4

#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();     // "&"を"&amp;"に変換     string work = buffer.Replace("&", "&amp;");     // 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#についても調べてみてはいかがでしょうか?

mkmarimo
質問者

お礼

2度の丁寧な回答ありがとうございます。 neuron-xさんのお陰で何とかなりそうです。 本当にありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

まず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でもそうでない場合もコンパイルすることが可能になります。

mkmarimo
質問者

お礼

回答ありがとうございます。 お陰様で疑問が解消されました。 何とかなりそうなので質問を締め切らせていただきます。 丁寧にありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

単にUnicodeといっても、ビッグエンディアンの場合もあるので、CStringで絶対大丈夫かというと、かなり微妙です。 もう少し用法の制約を厳しくするか、別の方法を考えた方がよさそうです。

mkmarimo
質問者

お礼

回答ありがとうございます。 考慮してプログラミングします。

関連するQ&A

  • 画像を暗号化しtxtで保存する方法をおしえてくだい

    いつもお世話になってます。 今回は画像をjavaで暗号化してtxtで保存する方法をおしえてください。 例えば、drawableフォルダの直下にbg.pngがあるとします。 (drawable/bg.png) これをjavaプログラムで暗号化し保存するにはどうしたらいいですか? 具体的なコードがなくて困っています。端的でもかまいませんのでサンプルコードをいただけると大変たすかります。 素人なので的外れな質問があるかと思いますが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 特殊文字「\」の変換の方法

    VC++2005のMFCにてプログラムを作成しています。 CFileDialogにてテキストファイルを読み込み、 読込んだファイルパスの「\」を「\\」になるように変換したいのですが、 実装の方法が分かりません。 ===================================== 例)C:\test\hoge.txt ⇒ C:\\test\\hoge.txt と変換する。 ===================================== 下記にファイルパスをCstring型で読み込み、 char型に変換するまでのプログラムを記載します。 理想としては、char型配列の中に、 「C:\\test\\hoge.txt」のような変換後のファイルパスを 入れたいのです。 解決方法をご存知の方おられましたら、ご教示お願いできませんでしょうか。 【プログラム】 /* ファイルオープンダイアログを表示 */ CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); CString filepath; if( ReadDlg.DoModal() == IDOK ) { filepath = ReadDlg.GetPathName(); // ファイルのフルパス名を取得 } CFile cfile; CFileException ex; if( !cfile.Open( filepath, CFile::modeRead , &ex ) ) { AfxMessageBox( "ファイルを開くのに失敗しました" ); // エラーメッセージを表示 return; } char st[255] = ""; strcpy( st, filepath );

  • unicodeファイルの読み込み

    javaアプレット上で BufferedReader file = new BufferedReader(new FileReader("C:/test/list.txt")); で外部テキストファイルを読み込んでいるのですが、この外部テキストファイルの文字コードをANSIからUnicodeに変えるとプログラムが動かなくなります。日本語やアルファベットではない文字の保存のためにテキストをUnicodeにて保存しなければならないのですが、どうすればUnicodeのテキストファイルを読み込むことができますか。

    • ベストアンサー
    • Java
  • unicodeの表示

    C言語でプログラミングをしているのですが、unicodeの表示方法がよくわかりません。┌という文字(unicodeでU+250C)を表示したく、wchar_t型など調べたのですがプログラムの書き方がよくわかりませんでした。unicodeを直接指定する方法か'┌'のように直接指定する方法が知りたいです。アドバイスお願いします。

  • VC++でファイルのオブジェクト

    VC++のMFCダイアログベースでプログラミングをしているのですが、ファイルI/Oに関して教えていただけないでしょうか。 現在、CFileを使用しています。 CFile f; で宣言したファイルオブジェクトを他の関数へ引き継ぐにはどうすればいいのでしょうか。 プログラム構造はマルチスレッドになっております。 うまく説明できないのですが、なにか助言をいただけないでしょうか。よろしくお願いします。

  • 標準出力をDOS窓を開かずにファイルに書き込む方法

    VC++(Console Appli)です。 あるコマンドの標準出力結果をファイルに吐き出す方法として、 単純には、 system("cmnd > C:\\temp.txt"); とやれば実現できますが、このとき、一瞬ですが、DOS窓の黒枠が表示されます。 このDOS窓を出さないで済む方法があれば教えてください。 標準出力を何らかの方法で受け取って、 ------------------------------------------------- CString str; CStdioFile file;   :  cmndの標準出力結果をstrへ内部的に受け取らせる。   : file.Open(_T("c:\\temp.txt"), CFile::modeWrite); file.WriteString(str); file.Close(); ------------------------------------------------- などで簡単に出来れば良いのですが・・よろしくお願いします。

  • テキストファイルの内容を連結する簡易な方法

    2つのバイナリ形式のデータが出力されたテキストファイル 「C:\a.txt」「C:\b.txt」の中身を結合させて、 1つのファイル「C:\c.txt」にまとめようと思っています。 ファイルパスを指定し、CFile::OpenとCFile::Readで 一つずつファイル内容を読み出し、c.txtに書き出す方法だと少し手間がかかるので、 より簡易な方法で一つのファイルにまとめたいのですが、 何か効率的で良い方法があれば、教えていただけませんでしょうか? 例えば、Linuxでいうcatコマンドのような方法があれば理想的なのですが。。 よろしくお願い致します。 開発環境:VC++2005、MFC

  • 画像の保存方法。

    VC++のMFC、ダイアログベースで画像処理のソフトを開発している者です。 ピクチャーコントロールに画像を表示させて、その画像を保存したいと思っています。 保存用のダイアログを開き、名前を付けて保存したいのですがうまくいきません。 下が今作っているプログラムです。 void Cstart2Dlg::OnBnClickedButton10() { CFileDialog myDLG(FALSE,"BMP","*.BMP", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate |CFile::modeWrite|CFile::typeBinary); UpdateData(TRUE); fout.WriteString(m_pict8); fout.WriteString("\xla"); filename = myDLG.GetPathName(); SetWindowText("start2"+filename); } ピクチャーコントロールの変数をm_pict8にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。 画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。

  • プログラムでtxtファイルを読み込みたいのですが

    5 10 15 ・ ・ ・ といった風にtxtファイルに保存されている複数の値を、プログラム上で配列に保存して、その値を使用したいのですが、可能でしょうか? できれば方法を教えてほしいです。よろしくお願いします!

  • フォルダの作成方法と保存方法

    VC++6.0でプログラミング中に 任意の名前のフォルダを作成し 作成したフォルダの中に プログラミング中にfopenし、作成書込みをした .txtファイルを保存したいと思っています。 fopenでファイルの作成は出来たのですが フォルダの作成と、保存場所(フォルダの中)の指定が出来ずに困っています。 知っている方いましたらご教授お願い致します。

専門家に質問してみよう