gpt4 book ai didi

c++ - 用于读取文本文件 C++ 的标准循环

转载 作者:行者123 更新时间:2023-11-28 05:39:09 25 4
gpt4 key购买 nike

我正在学习如何使用 C++ 处理文件,作为初学者,我有一些疑问需要澄清:

在我的书中,作者介绍了流状态并编写了这段简单的代码来展示如何读取直到我们到达文件末尾或终止符:

// somewhere make ist throw if it goes bad : 
void fill_vector(istream& ist, vector<int>& v, char terminator)
{
ist.exceptions(ist.exceptions() | ios_base::badbit);

for (int i; ist >> i;) v.push_back(i);
if (ist.eof()) return; // fine: we found end of file

// not good() not bad() and not eof(), it must be fail()
ist.clear();

char c;
ist >> c; // read a character, hopefully terminator

if (c != terminator) { // not the terminator, so we must fail
ist.unget(); // maybe my caller can use that character
ist.clear(ios_base::failbit);
}
}

这是第一个示例,它提供了一种有用的方法来读取数据,但我在第二个示例中遇到了一些问题,作者说:

Often, we want to check our read as we go along, this is the general strategy assuming that ist is an 'istream':

for (My_type var; ist >> var;) { // read until end of file 
// maybe check that var is valid
// do something with var

}

if (ist.fail()) {
ist.clear();
char ch;
// the error function is created into the book :
if (!(ist >> ch && ch == '|')) error("Bad termination of input\n");

}
// carry on : we found end of file or terminator

If we don't want to accept a terminator-that is, to accept only the end o file as the end- we simply delete the test before the call of error().

这是我的疑问:在第一个示例中,我们基本上检查了 istream 的每个可能状态,以确保读取如我们所愿终止,这没关系。但是我在理解第二个例子时遇到了问题:

  1. 作者说在调用错误之前删除测试是什么意思?

    1. 是否可以避免在读取时同时触发eof 和失败?如果是,如何?

我真的很困惑,我无法理解这个例子,因为从我所做的测试来看,failbit 总是在 eofbit 之后设置,那么如果它总是被触发,那么检查 failbit 有什么意义呢?作者为什么要这么做

最佳答案

What would happen to the code if I remove the test before the call of error as the author says ? Wouldn't that be useless as I would only be checking for the bad state of the stream ?

我想我明白你的意思了。不,它并不是真的没用,因为你会告诉某人(我不知道 error 实际上做了什么)、程序员(异常)或用户(标准输出),数据有一些无效数据,并且必须有人采取相应的行动。

它可能没用,但这取决于您希望函数执行的操作,例如,如果您希望它只是默默地忽略错误并使用已处理的正确数据,它确实是 无用。

How can I read data from a file until I just reach the end of that file without using any other terminator ?

我不明白你的意思,你已经在两个例子中这样做了:

if (ist.eof()) return; // fine: we found end of file 

if (ist.fail()) { //If 'ist' didn't fail (reaching eof is not a failure), just skip 'if'

关于c++ - 用于读取文本文件 C++ 的标准循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com