读取ANSI编码文本作为宽字符串
C++ - read ANSI encoded text as wide character string
我的目标是读取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编码的文本文件路径作为参数时,在运行时出现访问冲突错误。当文本大小足够大时,似乎会发生错误。我不知道问题出在哪里。
根据文档,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;
}
如果文件只包含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;
}
注:仔细阅读fgetws(3)手册页的NOTES。可以理解为吓人
相关文章:
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 在编译时检查字符串文本的长度
- 读取字符串文本输入以创建 2D 矢量
- 管理字符串文本的最佳做法
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 无法在模板参数中定义字符串文本
- 不推荐使用 PTCHAR 的字符串文本
- C++ 字符串文本和常量
- C++20字符串文本模板参数工作示例
- 返回从字符串文本创建的静态string_view是否安全?
- 在处理任何字符大小的模板中使用字符串文本
- 是否保证相同内容字符串文本的存储相同?
- 将以 null 结尾的字节字符串转换为原始字符串文本
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 使用C++中的模板检测不同的字符串文本
- 无法完全专用化字符串文本的模板
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 是否可以在原始字符串文本中插入转义序列?
- C++带有捕获组的正则表达式字符串文本
- 为什么多维数组中的空字符串文本衰减为空指针?