swprintf 和 fwprintf 和 %c 格式

swprintf and fwprintf and %c format

本文关键字:格式 fwprintf swprintf      更新时间:2023-10-16

宽字符打印f单个字符发生了什么变化?VS10 和 MCBS:

#include<stdio.h>
#include <windows.h>
int const maxPathFolder = MAX_PATH - 3;
wchar_t const *delims = L"T";
wchar_t *testString = L"Codepage is: ";
int main()
{
FILE *stream = NULL;
    UINT CP = GetConsoleOutputCP();
    wchar_t *testName= (wchar_t *)calloc(maxPathFolder, sizeof(wchar_t));
    wcscat_s(testName, maxPathFolder, L"C:\printemp.txt");
    stream = _wfopen(testName, L"w");
    if (fwprintf(stream, L"%s%i%c", testString, CP, delims) == EOF) wprintf(L"Problems writing to File.");
    fclose (stream);
    swprintf (testName, L"%s%i%c", testString, CP, delims);
    free (testName);
}

printemp.txt 中的输出是 Codepage is: 850? 的,swprintf'd testName 中的 delims 变量是汉字坠。根据伊戈尔在这篇文章中的评论,宽阔的溪流看起来有点破碎。

最终目标是将宽字符输出到文件数组,由分隔符分隔。有办法解决它?

代码页大部分已经过时,Unicode取代了它。这里的问题与以前相同,尝试以文本/ANSI模式打开Unicode文件。

由于您已经将其标记为c ++,因此您可以只使用标准库,std::wstringstd::wfstream,避免C字符串分配的麻烦。

#include <iostream>
#include <fstream>
#include <string>
#include <io.h> //for _setmode
#include <fcntl.h> //for _O_U16TEXT
int main()
{
    //optional: for non-local languages on console
    _setmode(_fileno(stdout), _O_U16TEXT);
    //write to file (overwrite old file if any)
    wchar_t wbuf[128];
    std::wofstream fout(L"path.txt", std::ios::binary);
    if (fout) 
    {
        fout.rdbuf()->pubsetbuf(wbuf, 128);
        fout << L"ελληνικάn";
        fout << L"Englishn";
        fout << 123 << "n";
        fout.close();
    }
    std::wifstream fin(L"path.txt", std::ios::binary);
    if (fin) 
    {
        fin.rdbuf()->pubsetbuf(wbuf, 128);
        std::wstring wstr;
        while (getline(fin, wstr, L'n')) std::wcout << wstr << L"n";
        fin.close();
    }
    return 0;
}

要与记事本等其他软件兼容,您必须在文件开头添加字节顺序标记:

fout << L"xFEFF";

然后在读取文件时跳过第一个字符(前 2 个字节)。

如果std::wstring不是一个选项,则使用 new/delete 运算符而不是 malloc

wchar_t *testName = new wchar_t[MAX_PATH];
...
delete[] testName;