0

我的目标是阅读 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 编码的文本文件路径作为参数传递时,运行时会出现访问冲突错误。当文本大小足够大时,似乎会发生错误。我不知道问题出在哪里。

4

2 回答 2

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;
}
于 2013-01-05T19:04:46.120 回答
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;
}

PS 仔细阅读fgetws(3)手册页的注释。可以理解为吓人。

于 2013-01-05T19:14:22.290 回答