无法停止使用 !feof() 读取 Unicode 文件

Can't stop reading Unicode file with !feof()

提问人:Huỳnh Lương Phương Trúc 提问时间:4/14/2018 更新时间:4/14/2018 访问量:303

问:

我不知道为什么 while 循环无法停止。它无法将 c 与 Delim 进行比较,也无法通过达到 eof 而停止。

wchar_t* Getline(const wchar_t* Filename, const wchar_t Delim){

FILE* f = _wfopen(Filename, L"r, ccs=UTF-8");

wchar_t* info = NULL;
wchar_t* temp = NULL;
int count = 1;
int i = 0;
wchar_t c;

c = fgetwc(f);

while (c != Delim || !feof(f))
{
    count++;
    temp = (wchar_t*)realloc(info, count * sizeof(wchar_t));

    if (temp)
    {
        info = temp;
        info[i] = c;
        i++;
    }

    else
    {
        free(info);
        wprintf(L"Failed to read\n");
    }
    c = fgetwc(f);
}
info[i] = '\0';

fclose(f);
return info;

}

读取文件中的所有字符后。它似乎没有停止。甚至 c 也与 Delim 相同。而 !feof(f) 也没有起作用。我尝试了 c != WEOF,但也失败了

我以为问题出在我阅读的文件中,但不是。我更改了另一个文件,但遇到了同样的问题。 谢谢你帮助我!

C Unicode FEOF

评论

0赞 user3629249 4/16/2018
关于: ,始终检查 (!=NULL) 中的值以确保操作成功。FILE* f = _wfopen(Filename, L"r, ccs=UTF-8");f
0赞 user3629249 4/16/2018
调用任何堆分配函数 1) 时,返回的类型为 ,因此可以分配给任何指针。强制转换只会使代码混乱,使其更难理解、调试等建议删除强制转换malloccallocreallocvoid*
0赞 user3629249 4/16/2018
强烈建议插入:else 的代码块。否则,代码将继续循环。充其量,输入的一个字符将丢失。更有可能的是,一旦失败,它将继续失败。perror( L"realloc failed" ); free( info ); exit( EXIT_FAILURE )' as the code in the realloc()
0赞 user3629249 4/16/2018
函数:fgetwc() 返回 ,而不是 .wint_twchar_t
0赞 user3629249 4/16/2018
建议将 while 循环写成: 它利用了调用while ( (c = fgetwc(f)) !=WEOF && (wchar_t)c != Delim )fgetwc()

答:

1赞 vogomatix 4/14/2018 #1

您希望在没有 Delim 字符且它不是文件末尾的情况下循环,因此请将 替换为||&&

while (!feof(f) && c != Delim)

编辑:顺序也已更改以响应评论

评论

1赞 Paul Ogilvie 4/14/2018
..您必须切换测试,因为如果为 true,则定义不明确。ceof()
0赞 Huỳnh Lương Phương Trúc 4/14/2018
我傻了。问题解决了。谢谢
0赞 vogomatix 4/14/2018
我们偶尔都会做傻事。P.S. 请接受答案