2013-04-04 2 views
5
ofstream outputFile ("output.txt"); 

if (outputFile.is_open()) 
{ 
    outputFile << "GLfloat vector[]={" << copy(vector.begin(), vector.end(), ostream_iterator<float>(cout, ", ")); << "}" << endl; 
} 
else cout << "Unable to open output file"; 

Как вывести вектор в файл с каждым поплавком, разделенным запятыми? Я также хотел бы избегать печати квадратных скобок, если это возможно.Запись вектора C++ в выходной файл

ответ

6
outputFile << "GLfloat vector[]={"; 
copy(vector.begin(), vector.end(), ostream_iterator<float>(outputFile , ", ")); 
                  ^^^^^^^^^^ 
outputFile << "}" << endl; 
+6

было бы здорово получить объяснение что вы сделали, в дополнение к коду. – dbliss

1

Вы приняли решение и попытались вставить его в вставку потока. Это не так, как это работает. Она должна быть отдельная строка:

outputFile << "GLfloat vector[]={"; 
copy(vector.begin(), vector.end(), ostream_iterator<float>(outputFile, ", ")); 
outputFile << "}" << endl; 

В copy алгоритм просто копирует элементы из одного диапазона в другой. ostream_iterator - специальный итератор, который фактически вставляет (с <<) в данный поток, когда вы делаете *it = item_to_insert;.

+0

Он по-прежнему говорит copy_n не объявлен, несмотря на все, включая следующие: '#include #include #include #include #include #include #include ' – user2136754

3

Во-первых, вы не должны называть свою переменную vector. Дайте ему имя, которое не является именем класса из стандартной библиотеки.

Во-вторых, ostream_iterator добавит ',' даже после того, как последний элемент вектора, который не может быть то, что вы хотите (разделитель должен быть сепаратор, и нет ничего, чтобы отделить последнее значение вектора из дальнейшее значение).

В C++ 11, вы можете использовать простой диапазон на основе for цикла:

outputFile << "GLfloat vector[]={"; 
auto first = true; 
for (float f : v) 
{ 
    if (!first) { outputFile << ","; } 
    first = false; 
    outputFile << f; 
} 
outputFile << "}" << endl; 

В C++ 03, он будет просто немного более многословен:

outputFile << "GLfloat vector[]={"; 
auto first = true; 
for (vector<float>::iterator i = v.begin(); i != end(); ++i) 
{ 
    if (!first) { outputFile << ","; c++; } 
    first = false; 
    outputFile << *i; 
} 
outputFile << "}" << endl; 
+1

Думаю, что вы получили что для смешивания цикла. – 0x499602D2

+0

@ 0x499602D2: Исправлено, спасибо;) –

+0

Нет проблем. Все в порядке, если я спрашиваю: почему вы не отвечали на вопросы в последнее время? – 0x499602D2

0

Вот хорошая общая (только для заголовка) библиотека, которую вы просто должны включить в свой код, и это позволит вам легко распечатать любые стандартные контейнеры: http://louisdx.github.com/cxx-prettyprint/

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