gpt4 book ai didi

c - wprintf 不打印特殊字符并且 fgetws 在一个是基金时返回 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:34 25 4
gpt4 key购买 nike

我对 fgetwswprintf 有疑问。

NULL 当之前打开的文件中有特殊字符时返回。 fgets 没有这个问题。

我尝试使用 setlocale,这里推荐:fgetws fails to get the exact wide char string from FILE*

但这并没有改变什么。

此外,wprintf(L"éé"); 打印 ?? (我也没有 printf 的这个问题)在终端(在 Ubuntu 12 上),如何避免这种情况?

编辑:正如评论中所要求的,这里是非常简单的代码:

# include "sys.h"
#define MAX_LINE_LENGTH 1024

int main (void){
FILE *File = fopen("D.txt", "r");

wchar_t line[MAX_LINE_LENGTH];
while (fgetws(line, MAX_LINE_LENGTH, File))
wprintf(L"%S", line);

fclose(File);
return 0;
}

最佳答案

默认情况下,当程序启动时,它在 C 语言环境中运行,除了翻译 C 程序所需的字符外,不能保证支持任何字符。 (它可以包含更多作为实现细节,但你不能依赖它。)为了使用 wchar_t 存储其他字符并使用宽字符转换函数或宽 stdio 函数处理它们,你需要设置支持这些字符的语言环境。

可用的语言环境及其命名方式因系统而异,因此您不应尝试通过名称设置语言环境。相反,将 "" 传递给 setlocale 以请求用户或系统的“默认”区域设置。在类似 POSIX 的系统上,这使用 LANGLC_* 环境变量来确定首选语言环境。只要您尝试使用的字符存在于用户的语言环境中,您的 wprintf 就应该可以工作。

setlocale 的调用应该如下所示:

setlocale(LC_CTYPE, "");

或:

setlocale(LC_ALL, "");

前者仅将语言环境设置应用于字符编码/字符类型函数(处理wchar_t 的事物)。后者还会导致区域设置并影响许多其他事物,例如消息语言、数字和时间的格式、...

需要注意的一个细节是,宽 stdio 函数绑定(bind)了在流“变得面向宽”时正在使用的语言环境的字符编码,即在执行的第一个宽操作上它。所以在使用wprintf之前需要调用setlocale

关于c - wprintf 不打印特殊字符并且 fgetws 在一个是基金时返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com