2014-10-28 2 views
2

У меня есть следующий рабочий код, который производит форматированный вывод с использованием потока, однако я чувствую, что все спецификаторы повторного формата затрудняют чтение. Есть ли способ установить точность, ширину и выравнивание навсегда для данного потока, который бы хорошо очистил вещи?Как удалить избыточность в форматированном потоке

#include <fstream> 
#include <iomanip> 

ofstream myfile; 
myfile.open(Output.c_str(), ios::trunc); 
for (int i = 0; i < iLen; i++) { 
    myfile <<std::fixed << std::setw(iWidth) << std::setprecision(iDecimals)<< std::right << pDist[i] << " " 
     <<std::fixed << std::setw(iWidth) << std::setprecision(iDecimals)<< std::right << pRes[i] << " " 
     <<std::fixed << std::setw(iWidth) << std::setprecision(iDecimals)<< std::right << pPhase[i] << "\n"; 
} 
myfile.close(); 
+4

Вы пытались просто удалить повторяющиеся спецификации формата? Большинство спецификаторов формата сохраняются до тех пор, пока они не будут явно изменены повторно. –

+2

'std :: fixed',' std :: setprecision' и 'std :: right' являются« постоянными ». Единственный, который вам нужен каждый раз, это 'setw'. –

+0

@CalvinScherle является правильным. Я попытался удалить спецификаторы, как это было предложено Code-Apprentice, но это не сработало, потому что я удалял все из них. Благодаря переполнению стека! – marcp

ответ

4

std::fixed, std::setprecision и std::right все "постоянный". Они устанавливают постоянные флаги для объекта потока.

Единственное, что вам нужно положить каждый раз, когда это setw, который (как я понимаю) не установлен флаг на объекте поток , только добавляет определенное количество пробелов путем изменения самого потока. Но он оставляет поток в покое.

Это похоже на endl, который работает на потоке, но оставляет объект реального потока в одиночку.

This answer by @LokiAstari по аналогичным вопросам, которые спецификаторы, как они выразились, «липкие» (и почему).

EDIT: прояснятся различия между объектом потока и фактическим потоком

2

Единственным манипулятором вам нужно беспокоиться о том, как std::setw ширина устанавливаются в ноль, когда operator<< называется. Перед вашей петли, вы можете установить «постоянный» Ios флаги:

myfile << std::fixed << std::setprecision(iDecimals) << std::right; 
for (int i = 0; i < iLen; i++) { 
    myfile << std::setw(iWidth) << pDist[i] << " " 
     << std::setw(iWidth) << pRes[i] << " " 
     << std::setw(iWidth) << pPhase[i] << "\n"; 
} 

Если вы хотите сбросить эти флаги на одном дыхании, вы можете использовать:

std::cout.copyfmt(std::ios(NULL)); 

Как указано в этом answer.

Смежные вопросы