Почему мои флаги" hex "и" oct " не работают? (С++)
Вот мой код:
// This program demonstrates the use of flags.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
string filename; bool tf; double number;
cout << "Name a file to create/overwrite: "; cin >> filename;
ofstream outfile (filename.c_str()); // open/create file.
if(outfile.fail()) {
cout << "Creating/Overwriting the file has failed.nExiting...n";
return 0;
}
cout << "Give me a boolean (0/1): "; cin >> tf;
cout << "Give me a large number with decimal points: "; cin >> number;
outfile.setf(ios_base::boolalpha); // Turns on boolalpha flag.
outfile << "Here's a boolean: " << tf << endl;
outfile.unsetf(ios_base::boolalpha); // Unsets boolalpha flag.
outfile << "Here's your number: " << number << endl;
outfile.setf(ios_base::scientific); // Turns on scientific notation flag.
outfile << "Here's your number is scientific notation: " << number << endl;
outfile.setf(ios_base::fixed); // When possible, floating point numbers will not appear in scientific notation.
outfile << "Here's your number in fixed notation: " << number << endl;
outfile.setf(ios_base::hex); // Numbers will appear in hexadecimal format.
outfile << "Here's your number in hexadecimal format: " << number << endl;
outfile.setf(ios_base::oct, ios_base::uppercase); // Numbers will appear in uppercase, octal format.
outfile << "Here's your number in octal format: " << number << endl;
return 0;
}
Когда я запускаю это...
Содержание теста .txt :
Here's a boolean: false
Here's your number: 3491.67
Here's your number is scientific notation: 3.491670e+03
Here's your number in fixed notation: 3491.67
Here's your number in hexadecimal format: 3491.67
Here's your number in octal format: 3491.67
Почему, когда я устанавливаю флаги "hex" и "oct", они не работают?
В текстовом файле я ожидал чего-то другого, кроме "3591.67" рядом с "шестнадцатеричным формальным:" и "восьмеричным форматом: ".
Я неправильно реализовал флаги?
2 ответа:
К сожалению, восьмеричная и шестнадцатеричная печать работает только для целых чисел, а не для двойников. См. http://stdcxx.apache.org/doc/stdlibug/28-3.html
Если вы хотите использовать setf, это должно быть:
outfile.setf(ios_base::hex,ios_base::basefield);
. Альтернативно, труба в std: hex, т. е.:
outfile << std::hex;
.
Восьмеричный и шестнадцатеричный форматы влияют только на то, как отображаются целые числа. Если вы хотите видеть числа с плавающей запятой в шестнадцатеричном коде, вы можете использовать
hexfloat
(C++11) или использовать функциюprintf
изcstdio
с кодом форматирования%a
.Смотрите также Dump hex float в C++