我在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返回非零值,那么它意味着错误但是这里返回的是什么?
答案 0 :(得分:2)
!is.eof()
返回您正在阅读的文件末尾不(因此true
不在最后,而false
位于结束)和
!os
返回您的输出文件是否不可写。换句话说,该程序返回:
true
表示您尚未到达输入文件的末尾(无论是2。)true
表示输出文件不可写(无论1。)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
。
这很简单。
os
是std::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)
该程序的目的是展示如何使用强大的迭代器来简明地实现常见问题。
istream_iterator< std::string >
允许以单词读取文件(也称为文件输入流),即使用空格字符作为分隔符。 vector< string > b {ii,eos};
通过迭代文件迭代器来初始化向量。这就是文件内容如何加载到内存中。
ostream_iterator< string> oo {os,"\n"};
允许使用行返回作为分隔符在输出流(此处为文件流)中写入
is.eof()
将为false,这意味着文件尚未被读取
答案 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。