c++の基礎の件につての補足

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
shika

c++の基礎の件につての補足

#1

投稿記事 by shika » 9ヶ月前

先ほどの質問は正しく動作する方でせた。
質問の趣旨はいかです。

コード:

#include <iostream>
using namespace std;

int main()
{//プログラムが上手く機能しない?
	int a = 8;
	
	cout << "         a = " << a << endl;
	cout.setf(ios::oct);
	cout << " 8進数 a = " << a << endl;	
	cout.unsetf(ios::oct);
}
です。なぜ機能しないのかが分かりません。
どなたか知っている人がいたら、ご教授願います。

アバター
みけCAT
記事: 6013
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: c++の基礎の件につての補足

#2

投稿記事 by みけCAT » 9ヶ月前

shika さんが書きました:先ほどの質問は正しく動作する方でせた。
「先ほどの質問」というのはわかりにくいです。プログラムが上手く機能しない?のことでしょうか?
リンクを貼るか、この場合は返信でもいいでしょう。
shika さんが書きました:なぜ機能しないのかが分かりません。
ios::decのフラグが既に立っているので、ios::octのフラグが無視されると予想できます。
ios_base::setf - C++ Reference
によると、1引数のsetfは単独のフラグのセットに用い、2引数のsetfはios::decやios::octなどのような選択フラグのセットに用いるのがいいようです。
ios::decのunsetfを追加した

コード:

#include <iostream>
using namespace std;

int main()
{//プログラムが上手く機能しない?
	int a = 8;
	
	cout << "         a = " << a << endl;
	cout.setf(ios::oct);
	cout.unsetf(ios::dec);
	cout << " 8進数 a = " << a << endl;	
	cout.unsetf(ios::oct);
}
では、2行目が8進数で出力されました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shika

Re: c++の基礎の件につての補足

#3

投稿記事 by shika » 9ヶ月前

ご返答ありがとうございました。

かずま

Re: c++の基礎の件につての補足

#4

投稿記事 by かずま » 9ヶ月前

解決したのなら、解決にチェックして送信をお願いします。

ios::oct を setf したいのなら、
ios::dec を unsetf するよりも、
ios::basefield を unsetf して、
ios::dec, ios::hex, ios::oct の全部をリセットしてから
ios::oct を setf しましょう。

この unsetf(ios::basefield) と setf(ios::oct) を
一度に行うのが、setf(ios::oct, ios::basefield) です。

基数の変更は、普通は、cout << oct のように
マニピュレータを使用します。

参考

コード:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << hex << setfill('0');
    cout << setw(4) << ios::skipws     << ": skipws\n";
    cout << setw(4) << ios::unitbuf    << ": unitbuf\n";
    cout << setw(4) << ios::uppercase  << ": uppercase\n";
    cout << setw(4) << ios::showbase   << ": showbase\n";
    cout << setw(4) << ios::showpoint  << ": showpoint\n";
    cout << setw(4) << ios::showpos    << ": showpos\n";
    cout << "--\n";
    cout << setw(4) << ios::left       << ": left\n";
    cout << setw(4) << ios::right      << ": right\n";
    cout << setw(4) << ios::internal   << ": internal\n";
    cout << "--\n";
    cout << setw(4) << ios::dec        << ": dec\n";
    cout << setw(4) << ios::oct        << ": oct\n";
    cout << setw(4) << ios::hex        << ": hex\n";
    cout << "--\n";
    cout << setw(4) << ios::scientific << ": scientific\n";
    cout << setw(4) << ios::fixed      << ": fixed\n";
    cout << "--\n";
    cout << setw(4) << ios::boolalpha  << ": boolalpha\n";
    cout << "==\n";
    cout << setw(4) << ios::adjustfield<< ": adjustfield = left | right | internal\n";
    cout << setw(4) << ios::basefield  << ": basefield = dec | oct | hex\n";
    cout << setw(4) << ios::floatfield << ": floatfield = scientific | fixed\n";
    cout << "==\n";
    cout << setw(4) << cout.flags() << ": flags()\n";
}
VC++の実行結果

コード:

0001: skipws
0002: unitbuf
0004: uppercase
0008: showbase
0010: showpoint
0020: showpos
--
0040: left
0080: right
0100: internal
--
0200: dec
0400: oct
0800: hex
--
1000: scientific
2000: fixed
--
4000: boolalpha
==
01c0: adjustfield = left | right | internal
0e00: basefield = dec | oct | hex
3000: floatfield = scientific | fixed
==
0801: flags()
0000: width()
0006: precition()
g++ の実行結果

コード:

1000: skipws
2000: unitbuf
4000: uppercase
0200: showbase
0400: showpoint
0800: showpos
--
0020: left
0080: right
0010: internal
--
0002: dec
0040: oct
0008: hex
--
0100: scientific
0004: fixed
--
0001: boolalpha
==
00b0: adjustfield = left | right | internal
004a: basefield = dec | oct | hex
0104: floatfield = scientific | fixed
==
1008: flags()

返信

“C言語何でも質問掲示板” へ戻る