无法理解这个C ++程序的返回值

时间:2018-05-15 09:43:56

标签: c++ ifstream istream-iterator

我在Stroustrup的TCPPPL中遇到了以下程序:

int main()
{
    string from, to;
    cin >> from >> to;  // get source and target file names

    ifstream is {from};  // input stream for file "from"
    istream_iterator<string> ii {is};  // input iterator for stream
    istream_iterator<string> eos {};  // input sentinel

    ofstream os{to};    // output stream for file "to"
    ostream_iterator<string> oo {os,"\n"};   // output iterator for stream

    vector<string> b {ii,eos};  // b is a vector initialized from input [ii:eos)
    sort(b.begin(),b.end());   // sor t the buffer

    unique_copy(b.begin(),b.end(),oo);// copy buffer to output, discard //replicated values
    return !is.eof() || !os; // return error state (§2.2.1, §38.3)
}

我的问题是最后一行是什么,即return !is.eof() ||!os;在做什么。我知道如果main返回非零值,那么它意味着错误但是这里返回的是什么?

6 个答案:

答案 0 :(得分:2)

!is.eof()

返回您正在阅读的文件末尾(因此true不在最后,而false位于结束)和

!os

返回您的输出文件是否可写。换句话说,该程序返回:

  1. true表示您尚未到达输入文件的末尾(无论是2。)
  2. true表示输出文件不可写(无论1。)
  3. false当你在文件的末尾并且输出文件是可写的时。

答案 1 :(得分:0)

class Recommender: def __init__(self): self.location_ids = self.get_location_ids() self.heavy_object1 = self.compute_heavy_object1(location_ids) self.heavy_object2 = self.compute_heavy_object2(..., location_ids) def get_location_ids(): locations = LocationNode.objects.filter(level=1, parent_id=1) return [location.id for location in locations] ... meantime in another file object_y = Recommender() @receiver(signal_x, dispatch_uid="update_state") def recompute(sender, **kwargs): client_id = kwargs['client_id'] # prepare some things heavy_recompute(object_y, client_id) 告诉输入流的读取是否到达文件末尾(因此在读取问题时表达式为真)。

!is.eof()使用!os运算符的重载,在写入问题时为真。

答案 2 :(得分:0)

如果main函数成功完成,则它将返回0,否则返回任何其他值。因此,行return !is.eof() || !os;正在执行以下操作:

EOF表示end of file。因此,is.eof()检查我们是否到达文件末尾。如果true则返回true or non 0,否则返回false or 0!生成结果inverse(原因为main,成功后退出0

同样适用于os。如果os是可写的,则返回true,否则返回false!生成结果inverse

因此,两者都必须以0退出。

答案 3 :(得分:0)

如果is.eof()发生文件结束,则

true会返回is
这很简单。

osstd::ostream的对象,其operator bool()。 这意味着os可以隐式转换为bool。完成后,如果流没有错误,则返回true

声明!is.eof() || !os是该计划的状态 它可以翻译成:

either the eof is not occurred for `is` OR `os` has some errors

这可以进一步翻译(使用De Morgan的法律):

eof is occured for `is` AND `os` has no errors

这意味着如果完全读取输入流并且输出正确写入且没有错误,则程序成功。

答案 4 :(得分:0)

此程序输出文件中输入文件中找到的单词的有序列表,成功时返回0或失败时返回1。

该程序的目的是展示如何使用强大的迭代器来简明地实现常见问题。

  • istream_iterator< std::string >允许以单词读取文件(也称为文件输入流),即使用空格字符作为分隔符。 vector< string > b {ii,eos};通过迭代文件迭代器来初始化向量。这就是文件内容如何加载到内存中。

  • ostream_iterator< string> oo {os,"\n"};允许使用行返回作为分隔符在输出流(此处为文件流)中写入

  • 如果文件不在最后,
  • is.eof()将为false,这意味着文件尚未被读取

  • !os是negative operator of output stream,如果发生错误则返回true。可能会发生错误,但这意味着不会创建输出文件。

答案 5 :(得分:-1)

如果你打破返回行很容易,你知道它会因错误返回非零值,所以这是一个加号。

!is.eof() || !os;

eof表示&#34;文件结束&#34;,所以第一部分读取&#34;如果它不在文件的末尾&#34;,则第二部分表示&#34;如果没有文件&#34;,因为你试图将某些东西保存到文件中,没有文件是一个错误。

所以,可以读取该行:

return not(are we in the end of the file that we are reading?) 
    or not (the output file exists?)

因此输入文件的结尾为true,输出文件存在,否则为false。