为什么这个文件不能成功读入?

时间:2017-04-29 23:41:10

标签: c++ ifstream

我试图读取一个看起来像这样的.dat文件:

T001CD1              10000.00             2.5         2
T001CD2              50000.00             3.5         6
H407CD1             20000.00             2.0         1
M555CD1            30000.00             3.5         5
N423CD1             50000.00             3.0         4
N423CD2             60000.00             2.5         2
S602CD1              80000.00             4.0         8
H707CD1             25000.00             2.5         7

使用此代码:

void readCdAccountInfo()
{
ifstream in_stream;


in_stream.open("CdAccounts.dat");

while (!in_stream.eof())
{ 
int i = 0;
string iDTemp;
float ratetemp;
int yeartemp;
double depotemp;
while (in_stream
    >> iDTemp
    >> depotemp
    >> ratetemp
    >> yeartemp
     )

{
    CCdAccount temp(iDTemp, depotemp, ratetemp, yeartemp);
    accounts[i] = temp;
    i++;
}

{
    if (in_stream.fail())
    {
        cout << "Input file opening failed. \n";
        exit(1);
    }

    in_stream.close();
}}
}

ID,存款(私人会员),费率和年份都是我所拥有的课程的一部分。

运行main时弹出的唯一内容是输入文件失败消息。

1 个答案:

答案 0 :(得分:0)

首先,在打开文件后立即检查打开错误。

ifstream in_stream("CdAccounts.dat");
if (in_stream.fail())
{
    cout << "Input file opening failed. \n";
    exit(1);
}

外部循环while (!in_stream.eof())已过时,因为您已正确检查内部循环中的流错误。

在下面的代码中,我不知道变量accounts的类型,但它似乎是一个数组。它与您遇到的问题没有直接关系,但如果文件包含的记录多于您为阵列保留的记录,则该数组可能会溢出。我建议改用std::vector,它会自动调整大小。

int i = 0;
string iDTemp;
float ratetemp;
int yeartemp;
double depotemp;

while (in_stream
    >> iDTemp
    >> depotemp
    >> ratetemp
    >> yeartemp
     )
{
    CCdAccount temp(iDTemp, depotemp, ratetemp, yeartemp);

    // Instead of this...
    accounts[i] = temp;
    i++;

    // ... I suggest declaring accounts as std::vector<CCdAccount>
    //     so you could add elements like this:
    // accounts.push_back( temp );
}

下一个问题是在此代码之后的错误检查中。作为评论者彼得指出:

  

到达文件末尾会设置流的eofbit。但是,运营   尝试阅读某些内容(如operator&gt;&gt;())也设置了   failbit如果到达文件末尾导致它们失败(即不是   收到输入)。

因此,要仅检查意外读取错误,我们必须从错误条件中排除eof位:

if (in_stream.fail() && ! in_stream.eof())
{
    cout << "Input file reading failed.\n";
    exit(1);
}

在函数结束时,不需要显式close()流,因为流的析构函数将在范围结束时自动关闭文件。拨打close()并不是一个错误,它只是过时了。