C++ 无法理解此C++;程序返回值

C++ 无法理解此C++;程序返回值,c++,ifstream,istream-iterator,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 ite

我在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)
}
intmain()
{
从,到;
cin>>从>>到;//获取源和目标文件名
ifstream是{from};//文件“from”的输入流
istream_迭代器ii{is};//流的输入迭代器
istream_迭代器eos{};//输入哨兵
ofstream os{to};//文件“to”的输出流
ostream_迭代器oo{os,“\n”};//流的输出迭代器
向量b{ii,eos};//b是从输入[ii:eos]初始化的向量
排序(b.begin(),b.end());//对缓冲区进行排序
唯一复制(b.begin(),b.end(),oo);//将缓冲区复制到输出,放弃//复制的值
return!is.eof()| |!os;//返回错误状态(§2.2.1,§38.3)
}

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

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

!is.eof() || !os;
eof表示“文件结束”,因此第一部分为“如果它不在文件结束处”,第二部分为“如果没有文件”,因为您试图将某些内容保存到文件中,没有文件是错误的

因此,该行可以读取:

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

这样,输入文件结束时返回true,输出文件存在,否则返回false

!is.eof()
返回您是否在正在读取的文件结尾处(因此
true
表示不在结尾处,而
false
表示在结尾处),以及

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

  • true
    适用于尚未到达输入文件末尾的情况(不考虑2)
  • true
    用于输出文件不可写时(不考虑1。)
  • false
    用于当您位于文件末尾且输出文件可写时
  • !is.eof()
    告知从输入流读取是否到达文件的末尾(因此,在读取问题时表达式为true)


    !os
    ,它使用了
    操作符的重载,在出现写入问题时是正确的。

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

    EOF
    表示
    文件结束
    。因此,
    is.EOF()
    检查我们是否到达文件结束。如果
    true
    则返回
    true或non 0
    ,否则返回
    false或0
    使结果与
    相反(原因是
    main
    在成功时以
    0
    退出)

    同样的事情也适用于
    os
    。如果
    os
    是可写的,则返回
    true
    ,否则返回
    false
    。并且
    使结果
    相反

    因此,如果
    is
    出现文件结尾,则这两个函数都必须以
    0
    退出
    is.eof()
    返回
    true

    这很简单

    os
    std::ostream
    的对象,它具有。 这意味着
    os
    可以隐式转换为
    bool
    。如果流没有错误,则返回
    true

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

    either the eof is not occurred for `is` OR `os` has some errors
    
    这可以进一步转化为(使用德摩根定律):

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

    此程序输出文件中输入文件中找到的单词的有序列表,成功时返回0,失败时返回1。 本程序的目的是展示如何使用功能强大的优秀迭代器简洁地实现一个常见问题

    • istream\u迭代器
      允许以文字读取文件(又称文件输入流),即使用空格字符作为分隔符。
      vectorb{ii,eos};
      通过在文件迭代器上迭代初始化向量。这就是文件内容加载到内存中的方式

    • ostream\u迭代器oo{os,“\n”};
      允许使用换行符作为分隔符写入输出流(这里是文件流)

    • is.eof()
      如果文件不在末尾,则将为false,这意味着该文件尚未读取

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

    标题和问题不太匹配?@DeiDei是的,所以更改了它。@AshutoshTiwari您是否试图查看文档,并了解它们返回的内容?这是一个合理的问题。请放下干草叉。@AshutoshTiwari为了避免将来出现这种情况,请正确设置您的问题的格式,并包含参考信息例如,你的代码中可能有一个向量,但如果没有向量,问题是相同的,“因此输入文件的结尾将返回true,而输出文件存在,否则将返回false。”你可能写了与它返回的相反的内容。如何是“is”在文件中移动时,它不是指向文件的开头吗?与操作系统的问题相同?–
    is
    &
    os
    不是指向任何东西的指针。它们是流的
    ifstream
    &
    的对象。它们在内部跟踪读/写偏移量。“is”是什么在文件中移动时,它不是指向文件的开头吗?与操作系统相同的问题
    
    either the eof is not occurred for `is` OR `os` has some errors
    
    eof is occured for `is` AND `os` has no errors