无法理解此 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:
true
当您还没有到达输入文件的末尾时(不管 2.)
true
用于当输出文件不可写时(不管 1.)
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
.
发生文件结尾
这很简单。
os
是 std::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 为真。可能会出现错误,但这意味着不会创建输出文件。
我在 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:
true
当您还没有到达输入文件的末尾时(不管 2.)true
用于当输出文件不可写时(不管 1.)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
.
发生文件结尾
这很简单。
os
是 std::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 为真。可能会出现错误,但这意味着不会创建输出文件。