试图读取宽字符给出EOF

试图读取宽字符给出EOF,第1张

概述我有一个文本文件,foo.txt,包含以下内容: R⁸2 我有一个大型程序读取它并对每个角色做事情,但是当它击中⁸时它总是收到EOF.这是代码的相关部分: setlocale(LC_ALL,"");FILE *in = fopen(argv[1],"r");while (1) { wint_t c = getwc(in); printf("%d ",wctob(c)); 我有一个文本文件,foo.txt,包含以下内容:

R⁸2

我有一个大型程序读取它并对每个角色做事情,但是当它击中⁸时它总是收到EOF.这是代码的相关部分:

setlocale(LC_ALL,"");file *in = fopen(argv[1],"r");while (1) {    wint_t c = getwc(in);    printf("%d ",wctob(c));    if (c == -1)        printf("Error %d: %s\n",errno,strerror(errno));    if (c == WEOF)        return 0;}

它打印82 -1(R和EOF的ASCII代码).无论我在文件中的哪个位置都有¹,它总是显示为EOF.编辑,我添加了一个errno检查,它给出了这个:

Error 84: InvalID or incomplete multibyte or wIDe character

但是,⁸是Unicode U+2078 ‘SUPERSCRIPT EIGHT’.我通过cat将其写入foo.txt并从fileformat.info复制粘贴. foo.txt的hexdump显示:

0000000: 52e2 81b8 32                             R...2

有什么问题?

解决方法 1.检查WEOF而不是EOF

EOF用于单字节字符. WEOF适用于广泛的角色.使用getwc读取宽字符的开头时,有时可以返回单字节EOF.

在stdio.h中:

#define EOF (-1)

在wchar.h中:

#define WEOF (0xffffffffu)

2.将语言环境设置为支持Unicode的语言环境

C程序的默认语言环境是C,也称为POSIX,仅适用于ASCII.使用setlocale,有时需要将适当的语言环境显式设置为支持Unicode的代码页. C.UTF-8是便携式的.

setlocale(LC_ALL,"C.UTF-8");setlocale(LC_CTYPE,"C.UTF-8");

3.对宽字符使用正确的类型

getwc的返回值不是char,int甚至是wchar_t,而是wint_t.确保您的字符变量c的类型为wint_t,以避免内存问题.

总结

以上是内存溢出为你收集整理的试图读取宽字符给出EOF全部内容,希望文章能够帮你解决试图读取宽字符给出EOF所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存