C++ std::fstream错误

C++ std::fstream错误,c++,file-io,std,C++,File Io,Std,我在解析文件时遇到了一些问题 我要分析的文件的最后两行是: f 814/866/896 1035/1100/989 817/965/898 [无,从\n开始生效] 以下是我读取文件的方式: while(!inFile.eof()) { inFile>>sCommand; if(sCommand == L"#") {} else if(sCommand == L"f") { int iP

我在解析文件时遇到了一些问题

我要分析的文件的最后两行是:

f 814/866/896 1035/1100/989 817/965/898

[无,从\n开始生效]

以下是我读取文件的方式:

while(!inFile.eof())
{
    inFile>>sCommand;

    if(sCommand == L"#") 
    {}
    else if(sCommand == L"f")
    {
        int iPos, iTex, iNorm;
        iPos=iTex=iNorm = -1;

        for(auto face=0; face<3; ++face)
        {
            inFile>>iPos;
            --iPos;
            if(inFile.peek() == L'/')
            {
                inFile.ignore();
                inFile>>iTex;
                --iTex;
                if(inFile.peek() == L'/')
                {
                    inFile.ignore();
                    inFile>>iNorm;
                    --iNorm;
                }
            }

            objVertexIndex iObj;
            iObj.iPos=iPos;
            iObj.iTex=iTex;
            iObj.iNorm=iNorm;
            this->AddVertex(iObj);
        }
        m_MaterialIndices_C.push_back(m_CurrentMaterial);
    } //END IF

    inFile.ignore( 1000, '\n' );
} //END WHILE
inFile.close();
while(!infle.eof())
{
填充>>命令;
如果(sCommand==L“#”)
{}
else if(sCommand==L“f”)
{
国际首次公开募股、iTex、iNorm;
iPos=iTex=iNorm=-1;
对于(自动面=0;面>iPos;
--首次公开募股;
if(infle.peek()==L'/'))
{
infle.ignore();
infle>>iTex;
--iTex;
if(infle.peek()==L'/'))
{
infle.ignore();
infle>>iNorm;
--iNorm;
}
}
objVertexIndex iObj;
iObj.iPos=iPos;
iObj.iTex=iTex;
iObj.iNorm=iNorm;
此->添加顶点(iObj);
}
m_材料C.推回(m_当前材料);
}//如果结束,则结束
填充。忽略(1000,“\n”);
}//结束时
infle.close();
然而,我在文件的最后一行遇到了一些问题,它什么也不包含。 在文件的最后一行之前,
infle.ignore(1000,“\n”);
将发生,我希望检测到
std::fstream::eof()
,但由于某些原因,它没有被检测到。 显然,如果一行中没有任何内容,那么
sCommand
仍将是前一行中的相同命令,这给了我一些麻烦


是否有办法检查此问题?如果有,如何检查?

不是真正的答案,而是注释(我不知道如何注释)。如果在最后一行后面有2个
\n
,则不会触发
eof
。我在使用
.eof()时遇到类似问题
最好检查您阅读的内容,作为是否继续阅读的条件。

可能重复:简而言之,eof()当流中没有可读取的内容时,不保证返回true。只有当您实际尝试读取超过结尾时,才会返回true。这意味着您需要先读取并查看是否成功,然后才使用值read执行操作。将读取操作置于
while
条件中:
while(infle>>sCommand){…
请同时阅读此和此