无法理解此 C++ 程序 return 值

Unable to understand this C++ program return value

我在 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 returns 非零值那么它意味着一个错误但是这里返回了什么?

如果你打破 return 行就很容易,你知道它 return 非零错误,所以这是一个加号。

!is.eof() || !os;

eof 表示 "end of file",因此第一部分为 "if it's not in the end of file",第二部分表示 "if there's no file",因为您试图将某些内容保存到文件中,没有文件是一个错误。

因此,可以读取该行:

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

所以输入文件结束时 return 为 true,输出文件存在,否则为 false。

!is.eof()

returns 是否 不在 您正在阅读的文件末尾(所以 true 不在末尾 false 因为在最后)和

!os

returns 您的输出文件是否不可 可写。也就是说,这个程序 returns:

  1. true 当您还没有到达输入文件的末尾时(不管 2.)
  2. true 用于当输出文件不可写时(不管 1.)
  3. false 用于当您位于文件末尾且输出文件可写时。

!is.eof() 表明从输入流读取是否到达文件末尾(因此在读取问题的情况下表达式为真)。

!os,它使用 ! 运算符的重载,在出现书写问题时为真。

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

EOF表示end of file。所以,is.eof() 检查我们是否到达文件末尾。如果 true 它 return 则 true or non 0,否则 false or 0! 使结果 inverse(原因是 main 成功退出并 0)。

同样的事情也适用于 os。如果 os 可写,则 return 为 true,否则为 false。而 ! 使得结果 inverse.

因此,他们都必须以 0.

退出

is.eof() returns true 如果 is.
发生文件结尾 这很简单。

osstd::ostream 的一个对象,它有 operator bool()。 这意味着 os 可以隐式转换为 bool。这样做后,如果流没有错误,它 returns true

语句!is.eof() || !os是程序的状态
可以翻译为:

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

这可以进一步翻译(使用德摩根定律)为:

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

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

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

这个程序的目的ose 是为了展示如何使用强大的迭代器来简洁地实现一个常见问题。

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

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

  • is.eof()如果文件不在末尾则为false,表示文件未读

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