Почему мои флаги" 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;
}

Когда я запускаю это...

Терминал Linux

Содержание теста .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 2

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++