在循环条件vs循环内设置一个等于file.get()的char

时间:2017-11-02 23:38:27

标签: c++

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;            
   }

我遗漏了打开文件的代码。

1 个答案:

答案 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包含有效字符,因此我们可以使用它。