fstream fin;
char c;
while((c = fin.get()) && fin) {
std::cout << c;
}
在此代码段中,(c = fin.get())
检查文件中是否还有任何字符,以便您不读取文件的长度?或者它实际上设置c等于它正在读取的字符?
此代码段与上面的代码段之间有什么区别?
fstream fin;
char c;
while(fin) {
c = fin.get();
std::cout << c;
}
我遗漏了打开文件的代码。
答案 0 :(得分:1)
第一条评论:std::basic_istream::get()返回int
。将其价值放在char
中是一个好主意吗?
回到你的问题:两个版本都错了。
第一个版本尝试读取一个字节,将get()
的返回值放在c
中,然后检查放入c
的值是否与零不同,如果是它检查流是否有效。为什么检查字节是否与零不同?
第二个版本同样糟糕:它检查先前的读取是否正常,然后读取数据,然后使用数据忘记检查当前读取是否成功。
如果您开始使用这种语言清楚地说明一切,那么尝试制作更紧凑的版本。伪代码:
begin loop
try to read data
did the read fail? Then exit loop
use the data
end loop
C ++版本:
while (true) {
char c = fin.get();
if (!fin)
break;
std::cout << c;
}
我非常支持这个版本的初学者,但是存在更紧凑的版本,例如:
char c;
while (fin.get(c)) {
std::cout << c;
}
在这种情况下,使用的函数是basic_istream& get( char_type& c );
,它试图从流中读取一个字符,如果成功,它将它存储在变量c
中并返回流本身。这意味着while将检查流fin
是否正常。如果流是正常的,变量c
包含有效字符,因此我们可以使用它。