ファイルの読み取りと書き込みを行うクラスを作成しようとしています。文字列の場合、ANSI と Unicode の 2 つの方法があります。ANSI 関数は問題ありませんが、私の Unicode 関数には問題があります。
「0xFEFF」のものをチェックしたりスキップしたりせずに、Unicodeファイルを直接、つまり直接読み取ることができるのは少し配線されています。どの言語を使用していても機能します (英語、中国語、日本語を試しました)。私が知っておくべきことはありますか?
次に、最大の問題が飛び出しました: Unicode 文字列をファイルに書き込むことです。最初に、「\n」文字を使用せずにアルファベットとして簡単な英語を試しましたが、うまくいきました。次に、「\ n」を押し込むと、問題が発生し始めます。出力は、「abcdefg \nhijklmn \nopqrst \nuvwxyz」(「\ n」は機能しますが、スペースが非常に多い)のように多くのスペースで挿入され、ファイルは再び ANSI になります。他の言語の文字を聞かないでください。まったく読めません。
ここで質問があります: Unicode 文字列をファイルに正しく書き込むにはどうすればよいですか? 「_wopen」関数については言及しないでください。ファイルは既に「fopen」関数で開かれています。
回答とアドバイスをいただければ幸いです。
Windows 7 とビジュアル スタジオを使用しています。
編集:次のコードで英語以外の文字に対して機能しますが、「\ n」ではまだ間違っています。
char* cStart = "\xff\xfe";
if (::ftell(m_pFile) == 0)
::fwrite(cStart, sizeof(wchar_t), 1, m_pFile);
しかし、それはどのように機能しますか?ファイルを読んでいる間、私はそれを見なかったということです。
編集:私のコードの一部。
void File::ReadWText(wchar_t* pString, uint32 uLength)
{
wchar_t cLetter = L'\0';
uint32 uIndex = 0;
do {
cLetter = L'\0';
::fread(&cLetter, sizeof(wchar_t), 1, m_pFile);
pString[uIndex] = cLetter;
}while (cLetter != L'\0' && !::feof(m_pFile) && uIndex++ < uLength);
pString[uIndex] = L'\0';
}
void File::WriteWText(wchar_t* pString, uint32 uLength)
{
char* pStart = "\xff\xfe";
if (::ftell(m_pFile) == 0)
::fwrite(pStart, sizeof(wchar_t), 1, m_pFile);
m_uSize += sizeof(wchar_t) * ::fwrite(pString, sizeof(wchar_t), uLength, m_pFile);
}
void main()
{
::File* pFile = new File();
wchar_t* pWString = L"abcdefg\nhijklmn\nopqrst\nuvwxyz";
pFile->Open("TextW.txt", File::Output);
// fopen("TextW.txt", "w");
pFile->WriteWText(pWString, ::wcslen(pWString));
pFile->Close();
}
出力ファイルの内容は次のとおりです。
「L'\n'」の正しい表現かどうかはわかりませんが、Unicode を扱ったことがありません。私を助けてくれてありがとう :)