C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

NaCl tips; <fstream>は事実上使えないみたい。ついでにstd::endlについておまけ記載

std::cout/std::cerrを使えるのはわかったけどログをファイル出力したいなと思って一応試してみた。やはりPepper APIファイルシステムしか使えないらしくstd::cin同様にコンパイルは通るが実行時に何も処理しないっぽい。

std::ofstream o("nacl-test.log");
o << "nacl-test" << std::endl;

おまけ

見掛ける多くのC++のコードでstd::endlは単に改行として使われているけれど、先のstd::cout/std::cerrでも敢えて使い分けておいたのには一応理由があったりします。

C++のstd::endlは改行文字の出力+バッファーのフラッシュです。つまり、厳密にはstd::endlはC#で云うところのEnvironment.NewLine相当ではありません。

そんな訳なので通常単に改行を差し込みたい場合には"\n"と書く(文字列中に入れられるし、短いくて楽だしね):

#include <iostream>
int main(){
  std::cout <<
    "multi\n"
    "line\n"
    "text"
    << std::endl;
}

最後だけstd::endlを使っているのは最後には改行してバッファーをフラッシュしたい場合。ちなみに改行せずにバッファーをフラッシュしたければ:

#include <iostream>
int main(){
  std::cout << "mokemoke" << std::flush;
}

とかstd::flushを使う。

std::coutではなくstd::cerrを使った時には最後に改行してバッファーをフラッシュしてねの意図でstd::endlは使わない。それをしたいとしても:

#include <iostream>
int main(){
  std::cerr <<
    "(」・ω・)」うー!\n"
    "(/・ω・)/にゃー!\n";
}

と最後に改行を入れてstd::cerrに放り投げるだけで良い。何故ならstd::cerrはパラメーターで渡されたオブジェクトを直ちにストリームへとフラッシュする事になっているからstd::flushを指示する必要が無いから。

書こうとしたNaCl tipsだけだとあんまりにも短いのでC++のtipsを1つ書いてみました。
(」・ω・)」うー!(/・ω・)/にゃー!