【发布时间】:2016-10-02 17:54:04
【问题描述】:
首先:我知道 C++ 有类似的主题,但我对标准 C 很好奇,我不相信我的问题与以前的问题有关。
我正在尝试为一个简单的程序实现 Unicode 支持,该程序只要求用户通过文件夹浏览器选择一个目录,然后将其传递给另一个程序(仅到达第一部分)。但是当尝试将接收到的路径写入文件时,会产生一个 0 字节的文件。当使用wprintf_s 打印出来时,非ASCII 字符会作为问号出现。我不相信有任何未定义的行为或任何东西,因为我已经仔细检查了文档。那我做错了什么?
目前的代码如下所示(只是严格测试条件下的最低要求):
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
int main()
{
BROWSEINFOW bi = { 0 };
LPITEMIDLIST pidl;
wchar_t path[MAX_PATH];
pidl = SHBrowseForFolderW(&bi);
SHGetPathFromIDListW(pidl, path);
wprintf_s(L"%s\n", path);
return 0;
}
上面的代码定期打印它。当尝试写入文件时,我将 wprintf_s 调用替换为这个(当然首先声明了 FILE *f):
if(_wfopen_s(&f, L"C:\\test.txt", L"w"))
{
fwprintf_s(f, L"%s\n", path)
fclose(f);
}
但是,我也尝试将fwrite 与w 和wb 模式一起使用,但所有方法都会导致一个空文件。
【问题讨论】:
-
试试`_setmode(_fileno(stdout), _O_U16TEXT);`stackoverflow.com/a/36527398/4603670
-
@BarmakShemirani 呵呵。这适用于标准输出,但我仍然得到实际文件的空输出?有什么想法吗?
-
问题是终端应用或显示输出的应用可能配置不正确。
-
每当 I/O 函数无法按预期工作时,最好检查函数的返回值。
-
@chux 再次,我检查了文档 - 事实上仔细检查。
wprintf_s只接受格式字符串和相应的参数,就像常规函数一样。你自己看。但无论如何,stdout 的问题已经解决了。剩下的问题是写入实际文件。