C ++ - 将ANSI编码的文本读作宽字符串

时间:2013-01-05 18:57:01

标签: c++

我的目标是阅读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编码的文本文件路径作为参数传递时,在运行时出现“访问冲突”错误。看起来当文本大小足够大时会发生错误。我无法弄清楚问题出在哪里。

2 个答案:

答案 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 。可以理解为可怕。