2

我正在使用文件系统库,并且正在尝试创建一个 readline 函数。

int al_fgetc(ALLEGRO_FILE *f)

在 5.0.0 中引入

读取并返回给定文件中的下一个字节。在文件结尾或发生错误时返回 EOF。

那是我从库中使用的功能。我想要做的是 += 将结果字符转换为 std 字符串,如果它是 != EOF 是-1。我只是不确定是否需要强制转换以获得正确的结果。这样的事情会做到吗:

bool File::readLine( std::string& buff )
{
    if(eof() || !isOpen())
    {
        return false;
    }
    buff = "";
    int c = 0;
    while(c = al_fgetc(m_file) != EOF && c != '\n')
    {
        buff += (char)c;
    }
    return buff.length() > 0;
}

我将从文件中读取 utf-8,所以我需要确保它正常工作。

谢谢

4

3 回答 3

4

是的,这将起作用,除非您需要一组额外的括号,因为!=运算符的优先级高于=运算符:

while((c = al_fgetc(m_file)) != EOF && c != '\n')
    ...

fgetc返回int而不是的唯一原因char是有 257 个可能的返回值:所有 256 个可能的字节,或EOF,这表明文件中没有更多数据了。它将始终返回 0-255 或EOF,因此一旦您测试了它,将返回值强制转换为char或是安全的。unsigned charEOF

于 2012-07-24T19:17:13.000 回答
1

是的,他们返回 int 的唯一原因是因为 char 中没有可用于 EOF 信号的“自由”值。因此,检查它不是 EOF 并随后将其转换回 char 正是他们希望你做的。

于 2012-07-24T19:13:04.977 回答
1

尝试使用 feof(m_file) 检查您是否已到达文件末尾,而不是检查 fgetc 返回的字符。这应该将您的读取循环与 eof 检查分开,因此不需要强制转换。

于 2012-07-24T19:14:33.530 回答