ifstream:跳过读取包含NaN的行

ifstream: Skip reading lines containing NaN

本文关键字:包含 NaN 的行 读取 ifstream      更新时间:2023-10-16

我正在VS2012 c++上使用ifstream阅读文本文件。是否有一种简单的方法可以跳过包含"NaN"的阅读行?

ifstream loadFile;
loadFile.open("data.txt", ios::in);
double x;
int numLine = 3;
int numCol = 4;
vector< vector<int> > data(numLine, vector<int> numCol);
for( int i=0; i< numLine; i++){
    for ( int j=0; j< numCol; j++){
        loadFile >> x ;
        data[i][j] = x;
    }
} 

文件示例:

2.4 4.6 6.8 0.34
5.34 3.4 NaN 1.1 
2 -4 -6 5 

很难检测到输入字符串实际上是"NaN",但你可以做

if (!(loadFile>>x)) // Read might fail on "NaN"
{
    loadFile.clear(); // Reset error state
    loadFile.ignore(3); // This assumes we only fail on NaN.
}

只忽略单个输入。当然,如果你的输入可以包含-NaN或其他长度的输入!=3那么你需要更聪明一点。如果你需要忽略整行,那么你需要在坏行之后重置i

您可以使用isnan函数:http://en.cppreference.com/w/cpp/numeric/math/isnan