fgetwc EOF 循环测试失败,但 65535 正常
fgetwc EOF loop test fails, but 65535 OK
VS10 & MCBS:
为此,我创建了一个名为c:\eoftest的文件,其中包含文本"test"。在以下代码中,第 5 次传递的 ch 值是 fgetwc 返回的 65535,但它并不等同于 EOF,我们都知道 stdio.h 中将其定义为 (-1):
#include <stdio.h>
#include <windows.h>
int main()
{
int ch;
FILE *stream = NULL;
wchar_t buf[5];
memset (buf, ' ', sizeof(buf));
stream = _wfopen(L"C:\eoftest.txt", L"r");
for (int i = 0; (i < (sizeof(buf) - 1) && ((ch = fgetwc(stream)) != EOF) && (ch != ' ')); i++) //we are reading so last null condition mandatory
{
ungetwc(ch, stream);
buf[i] = (wchar_t)(ch = fgetwc(stream));
}
}
在这种情况下,用(ch = fgetwc(stream)) != 65535)
替换条件(原文如此)是有效的,但是没有采取什么措施来确保EOF测试可以成功?
来自 MSDN 文档 for fgetc, fgetwc
fgetc
返回作为int
读取的字符,或返回指示错误或文件结尾的字符EOF
。fgetwc
返回,作为wint_t
,对应于读取字符或 返回WEOF
以指示错误或文件结束。
WEOF
定义为您之前替换的0xFFFF
65535
#define WEOF ((wint_t)(0xFFFF))
因此,宽字符的EOF
测试应更改为
if ((ch = fgetwc(stream)) != WEOF) ...
<小时 />编辑
int main()
{
wchar_t buf[5];
memset(buf, ' ', sizeof(buf));
wcscpy(buf, L"1234");
FILE *stream = _wfopen(L"C:\eoftest.txt", L"rb");
if (!stream)
{
stream = _wfopen(L"C:\eoftest.txt", L"w+b");
if (!stream)
{
printf("cannot create filen");
return 0;
}
fwrite((char*)buf, sizeof(buf[0]), wcslen(buf), stream);
fseek(stream, 0, 0);
}
int len = sizeof(buf) / sizeof(buf[0]);
for (int i = 0; i < len; i++)
{
wchar_t ch = fgetwc(stream);
if (ch == WEOF) break;
buf[i] = ch;
}
wprintf(L"result = %sn", buf);
return 0;
}
<小时 />编辑2:这将逐行打印unicode文件的内容:
int main()
{
FILE *stream = _wfopen(L"c:\test\test.txt", L"rb");
if (!stream) return 0;
int buflen = 256;
wchar_t* buf = (wchar_t*)malloc(buflen * sizeof(wchar_t));
if (fread(buf, 2, 1, stream))
{
if (buf[0] != 0xFEFF)
{
//BOM not detected, go back to start of file
rewind(stream);
}//else, skip the first 2 bytes
}
int i = 0, line = 0;
wint_t ch = 0;
while (ch != WEOF)
{
ch = fgetwc(stream);
if (ch == L'n' || ch == WEOF)
{
//null-terminate the buffer at i
buf[i] = L' ';
//trim the 'r' at the end, if any
if (i > 0 && buf[i - 1] == 'r') buf[i - 1] = L' ';
wprintf(L"%3d %sn", ++line, buf);
//start a new line for the next pass
i = 0;
}
else
{
buf[i] = ch;
i++;
if (i == buflen)
{
//increase buffer:
buflen += 256;
buf = (wchar_t*)realloc(buf, buflen * sizeof(wchar_t));
}
}
}
free(buf);
return 0;
}
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么constexpr的性能比正常表达式差
- 不确定要在我的main中放入什么才能使我的代码正常工作
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么 HeapFree() 不能正常工作?
- 我的评分程序无法正常工作
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- OpenSSL 解密功能无法正常工作
- 为什么文本运算符不能正常模板化?
- 链表中的显示功能无法正常工作
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- execlp() 在 fork() 之后无法正常工作
- 基于范围的变换以实现正常循环
- 为什么我在 AVR 中的中断无法正常工作?
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- fgetwc EOF 循环测试失败,但 65535 正常