C ++ Vector в CSV, добавляя запятую после каждого элемента - PullRequest
1 голос
/ 13 марта 2011
vector<string> v;
v.push_back("A");
v.push_back("B");
v.push_back("C");
v.push_back("D");

for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
//printout 
   cout << *it << endl;

}

Мне нравится добавлять запятую после каждого элемента следующим образом: А, В, С, D

Я пытался исследовать Google, но нашел только CSV до vector.

Ответы [ 5 ]

7 голосов
/ 13 марта 2011

Вы можете выводить запятые в цикле for:

for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
//printout 
   cout << *it << ", " << endl;
}

Или вы можете использовать алгоритм copy.

std::copy(v.begin(), v.end(), std::ostream_iterator<char*>(std::cout, ", "));
6 голосов
/ 13 марта 2011

Loop way:

for (vector<string>::iterator it = v.begin(); it != v.end(); ++it) {
   if (it != v.begin()) cout << ',';
   cout << *it;
}

"Умный" способ:

#include <algorithm>
#include <iterator>

if (v.size() >= 2)
   copy(v.begin(), v.end()-1, ostream_iterator<string>(cout, ","));
if (v.size() >= 1)
   cout << v.back();
2 голосов
/ 13 марта 2011

С помощью обычного ostream_iterator вы получите запятую после каждого элемента данных, включая последний, где он вам не нужен.

Я опубликовал infix_iterator в предыдущем ответе , который устраняет эту проблему, помещая запятые между элементами данных, а не после последнего.

0 голосов
/ 22 марта 2011

Ниже следует выполнить работу. Благодарю.

    ofstream CSVToFile("ava.csv", ios::out | ios::binary);
    //////////////////vector element to CSV////////////////////////////////////////
for (std::vector<string>::iterator i = ParamHeaders.begin(); i != ParamHeaders.end(); i++)
{
    if (i != ParamHeaders.begin()) 
    {
            CSVToFile << ",";
            std::cout << ",";
    }
    std::cout << *i;
    CSVToFile << *i;

}
0 голосов
/ 13 марта 2011

Чтобы избежать запятой, используйте цикл до v.end () - 1 и выводите v.back () , например:

#include <vector>
#include <iostream>
#include <iterator>
#include <string>
#include <iostream>

template <class Val>
void Out(const std::vector<Val>& v)
{
    if (v.size() > 1)
        std::copy(v.begin(), v.end() - 1, std::ostream_iterator<Val>(std::cout, ", ")); 
    if (v.size())
        std::cout << v.back() << std::endl;
}
int main()
{
    const char* strings[] = {"A", "B", "C", "D"};
    Out(std::vector<std::string>(strings, strings + sizeof(strings) / sizeof(const char*)));

    const int ints[] = {1, 2, 3, 4};
    Out(std::vector<int>(ints, ints + sizeof(ints) / sizeof(int)));
}

Кстати, вы отправили:

vector<string> v; 
//...
for (vector<int>::iterator it = v.begin(); //...

, что вряд ли скомпилировать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...