我正在使用文件系统库,我正在尝试创建一个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,因此我需要确保其正常工作。
由于
答案 0 :(得分:4)
是的,除非您需要一组额外的括号,否则这将有效,因为!=
运算符的优先级高于=
运算符:
while((c = al_fgetc(m_file)) != EOF && c != '\n')
...
fgetc
返回int
而不是char
的唯一原因是有257个可能的返回值:所有256个可能的字节,或EOF
,表示有文件中没有剩余数据。它将始终返回0-255或EOF
,因此在您为char
测试后,将返回值转换为unsigned char
或EOF
是安全的。
答案 1 :(得分:1)
是的,他们返回int的唯一原因是因为char中没有可用于EOF信令的“free”值。因此,检查它不是EOF,然后将其重新投入char,这正是他们期望你做的。
答案 2 :(得分:1)
尝试使用feof(m_file)检查您是否已经到达文件末尾而不是检查fgetc返回的字符。这应该从eof检查中分离你的读取循环,因此不需要进行转换。