プロが教える店舗&オフィスのセキュリティ対策術

VC++.NETを使ってプログラミングをしております。

タイトルの通り、Unicodeで保存されているtxtファイルを
開いて編集後、再びUnicodeのtxtで保存したいのですが、
具体的な方法がわかりません。

普通にCFileクラスで開いて、CStringクラスで編集後、
保存して大丈夫でしょうか?

サンプルプログラムが紹介されているWEBページや、方法を
ご存知の方教えてください。

A 回答 (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();

    // "&"を"&"に変換
    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#についても調べてみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

2度の丁寧な回答ありがとうございます。

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

お礼日時:2006/01/15 18:48

まず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でもそうでない場合もコンパイルすることが可能になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

丁寧にありがとうございました。

お礼日時:2006/01/15 18:46

単にUnicodeといっても、ビッグエンディアンの場合もあるので、CStringで絶対大丈夫かというと、かなり微妙です。


もう少し用法の制約を厳しくするか、別の方法を考えた方がよさそうです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

考慮してプログラミングします。

お礼日時:2006/01/15 18:45

MFCのCStringはUnicodeに対応しているようです。

また、CFileでUnicodeのファイルを読み書きしても問題はありませんでした。
http://www.microsoft.com/japan/developer/library …

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です。

neuron-xさん、丁寧な回答ありがとうございます。

欲しい答えがいただけ感謝しております。

ところで、補足質問が2点あります。
申し訳ありませんが、また時間があればご教授ください。

【補足質問1】
回答2行目の参考URLの内容ですが、VC++の設定をデフォルトのままで
ビルドしてもUnicodeでのファイル保存はできないということでしょうか?
内容をじっくり読んでもあまり理解できませんでした。
申し訳ありません。


【補足質問2】
記載していただいているサンプルプログラムですが、
namespaceなどがありますが、C++なのでしょうか?
あまり知識がなく申し訳ないのですが、C#のサンプルかと感じます。


以上。よろしくお願いします。

補足日時:2006/01/15 00:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!