我试图读取一个看起来像这样的.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时弹出的唯一内容是输入文件失败消息。
答案 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()
并不是一个错误,它只是过时了。