36056


[前回の質問で頂いた回答](https://ja.stackoverflow.com/questions/36036/c%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7-%E3%81%9D%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%9216%E9%80%B2%E6%95%B0%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)についての質問です。

開いたファイルデータ`fin`をおそらく表示している箇所

[code]

    while ((ch = fin.get()) != -1)
        std::cout << std::hex << std::uppercase << ch << ' ';
    
[/code]

while文なので、繰り返し何かをしていると思いますが、実際これはどのような事をしているのでしょうか？


CC BY-SA 3.0
2017-07-03T03:41:30.033
36054
2017-07-03T11:31:07.770
2017-07-03T11:31:07.770
19110
20192
question
c++
while文の繰り返しでどのような事を行っているのかがわからない


分解して順に説明していきます。

>
[code]

>     ch = fin.get()
>  
[/code]

[`ifstream::get()`](https://cpprefjp.github.io/reference/istream/basic_istream/get.html)を呼び出し変数`ch`に代入します。`ifstream::get()`はファイル終端に達した場合に`-1`を返します。

>
[code]

>     (ch = fin.get()) != -1
>  
[/code]

これは`ch = fin.get()`実行後に`ch != -1`を評価します。つまり終端に達しない限り`true`となります。

>
[code]

>     while ((ch = fin.get()) != -1)
>  
[/code]

つまり、終端に達するまで`ch`への代入及びループを繰り返します。  
次にループする内容ですが、

>
[code]

>     std::cout << std::hex
>  
[/code]

`std::cout`の出力形式を[`std::hex`](https://cpprefjp.github.io/reference/ios/hex.html)つまり16進表記に変更します。

>
[code]

>     std::cout << std::hex << std::uppercase
>  
[/code]

`std::cout`の出力形式を[`std::uppercase`](https://cpprefjp.github.io/reference/ios/uppercase.html)つまり大文字に変更します。これで`printf()`の`%X`相当になります。

>
[code]

>     std::cout << std::hex << std::uppercase << ch
>  
[/code]

`printf()`の`%X`相当の形式で`ch`変数の値を出力します。

>
[code]

>     std::cout << std::hex << std::uppercase << ch << ' ';
>  
[/code]

続けて`' '`つまりスペースを出力します。


CC BY-SA 3.0
2017-07-03T04:01:26.813
36056
2017-07-03T04:01:26.813
4236
36054
answer