C ++ ostream from manipulation

Well, in principle, it should list all vector coordinates in this format:

(x, y, z)

but at the moment he is doing this (x, y, z,)

The easiest way will be used if in a for loop, but can I subtract a small piece of the string from the out variable?

my code is:

template <unsigned short m> std::ostream& operator<<(std::ostream& out, const Vector<m>& v) { out << "("; for(int i = 0; i < m; i++) { out << v.coords[i] << ", "; } out << ")"; return out; } 
+5
c ++ ostream
Mar 13 2018-11-11T00:
source share
4 answers

It's impossible. Another possibility: exit from the loop the output part of the first or last coordinate. Then there is no need for if (or the ?: Operator) inside the loop, but processing an empty vector is more complicated, since it will need if outside the loop.

+3
Mar 13 '11 at 9:02
source share

This is from my old code base. On the other hand: it comes with unit tests:

Updated today, a more general and standalone Live On Coliru

 /*! note: delimiter cannot contain NUL characters */ template <typename Range, typename Value = typename Range::value_type> std::string Join(Range const& elements, const char *const delimiter) { std::ostringstream os; auto b = begin(elements), e = end(elements); if (b != e) { std::copy(b, prev(e), std::ostream_iterator<Value>(os, delimiter)); b = prev(e); } if (b != e) { os << *b; } return os.str(); } /*! note: imput is assumed to not contain NUL characters */ template <typename Input, typename Output, typename Value = typename Output::value_type> void Split(char delimiter, Output &output, Input const& input) { using namespace std; for (auto cur = begin(input), beg = cur; ; ++cur) { if (cur == end(input) || *cur == delimiter || !*cur) { output.insert(output.end(), Value(beg, cur)); if (cur == end(input) || !*cur) break; else beg = next(cur); } } } 

And some relevant unit tests:

 void testSplit() { std::vector<std::string> res; const std::string test = "a test ,string, to,,,be, split,\"up,up\","; TextUtils::Split(',', res, test); UT_EQUAL(10u, res.size()); UT_EQUAL("a test ", res[0]); UT_EQUAL("string", res[1]); UT_EQUAL(" to", res[2]); UT_EQUAL("", res[3]); UT_EQUAL("", res[4]); UT_EQUAL("be", res[5]); UT_EQUAL(" split", res[6]); UT_EQUAL("\"up", res[7]); // Thus making 'split' unusable for parsing UT_EQUAL("up\"", res[8]); // csv files... UT_EQUAL("", res[9]); TextUtils::Split('.', res, "dossier_id"); UT_EQUAL(11u, res.size()); res.clear(); UT_EQUAL(0u, res.size()); TextUtils::Split('.', res, "dossier_id"); UT_EQUAL(1u, res.size()); std::string UseName = res[res.size() - 1]; UT_EQUAL("dossier_id", UseName); } void testJoin() { std::string elements[] = { "aap", "noot", "mies" }; typedef std::vector<std::string> strings; UT_EQUAL("" , TextUtils::Join(strings(), "")); UT_EQUAL("" , TextUtils::Join(strings(), "bla")); UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), "")); UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), "#")); UT_EQUAL("aap" , TextUtils::Join(strings(elements, elements + 1), "##")); UT_EQUAL("aapnoot" , TextUtils::Join(strings(elements, elements + 2), "")); UT_EQUAL("aap#noot" , TextUtils::Join(strings(elements, elements + 2), "#")); UT_EQUAL("aap##noot" , TextUtils::Join(strings(elements, elements + 2), "##")); UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), "")); UT_EQUAL("aap#noot#mies" , TextUtils::Join(strings(elements, elements + 3), "#")); UT_EQUAL("aap##noot##mies", TextUtils::Join(strings(elements, elements + 3), "##")); UT_EQUAL("aap noot mies", TextUtils::Join(strings(elements, elements + 3), " ")); UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), "\0")); UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), std::string("\0" , 1).c_str())); UT_EQUAL("aapnootmies" , TextUtils::Join(strings(elements, elements + 3), std::string("\0+", 2).c_str())); UT_EQUAL("aap+noot+mies" , TextUtils::Join(strings(elements, elements + 3), std::string("+\0", 2).c_str())); } 

Watch Live On Coliru

+15
Mar 13 '11 at 11:50
source share

Use the if statement to add a comma.

 for(int i = 0;i<m;i++) { out<<V.coords[i]; if(i !=m-1) out<<","; } 
+4
Mar 13 '11 at 9:02
source share

The loop from i to m-1 prints the value and a comma, and then at the end of the loop (where you print ")") print the last element without a comma

+2
Mar 13 2018-11-11T00:
source share



All Articles