我的目标是阅读ANSI编码的文本。但由于某些原因,我正在使用fgetws()(而不是fgets)函数,当然文件是以二进制模式打开的。这是演示我的问题的简短代码
bool testfunc(wchar_t path[])
{
wchar_t buffer[10];
if( FILE * fr=_wfopen(path,L"rb") )
{
fgetws(buffer,sizeof(buffer),fr);
fclose(fr);
return true;
}
else return false;
}
当我调用此函数并将ANSI编码的文本文件路径作为参数传递时,在运行时出现“访问冲突”错误。看起来当文本大小足够大时会发生错误。我无法弄清楚问题出在哪里。
答案 0 :(得分:2)
根据文档,fgetws
的第二个参数是数组中宽字符的数量,而不是字节,所以:
fgetws(buffer,sizeof(buffer)/sizeof(*buffer),fr);
一个有用的经典宏是:
#define countof(x) (sizeof(x)/sizeof(*(x)))
或者一个奇特的C ++模板:
template <typename T, int N>
int countof(T (&a)[N])
{
return N;
}
答案 1 :(得分:1)
如果文件只包含ASCII个字符(请记住,ASCII是Unicode的子集,并且wchar_t
的大小是特定于实现的,可能适合某些固定宽度编码Unicode字符的子集;因此wchar_t
不是非常便携)您需要将每个ASCII字符转换为其宽字符等效字符:
{
#define SIZE 80
char cbuf[SIZE];
wchar_t wbuf[SIZE];
char* pc;
wchar_t* pw;
memset (cbuf, 0, sizeof(cbuf));
memset (wbuf, 0, sizeof(wbuf));
fgets (cbuf, SIZE, fr);
for ((pc=cbuf), (pw=wbuf); pc<cbuf+SIZE && *pc != 0; pc++, pw++)
*pw = (wchar_t) *pc;
}
P.S。仔细阅读fgetws(3)手册页的 NOTES 。可以理解为可怕。