Reputation: 7546
I am stripping off double quotes from a string, but I keep getting this error from the following function. What is the problem here?
void readCSVCell(stringstream& lineStream, string& s) {
std::getline(lineStream,s,',');
s.erase(remove( s.begin(), s.end(), '\"' ), s.end());
}
[ERROR]
c.cpp: In function
void readCSVCell(std::stringstream&, std::string&)
:
c.cpp:11: error: cannot convert__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >
toconst char*
for argument1
toint remove(const char*)
Upvotes: 8
Views: 28483
Reputation: 2588
I'm late to the party but here's a way applies to C++14 and above with std::quoted
. It's handy since CSV might have custom escape characters as well.
In short, it translates csv double-double quote escaped string "something ""including escaped quotes"" cool"
into something "including escaped quotes" cool
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <string_view>
int main()
{
const char delim{'"'};
const char escape{'"'};
constexpr static std::string_view TEXT ="\"something \"\"including escaped quotes\"\" cool\"";
std::stringstream ss;
ss << TEXT;
std::cout << "stored as [ "<< ss.str() << "]\n";
std::string out;
ss >> std::quoted(out,delim, escape);
std::cout << "written out ["<< out << "]\n";
return 0;
}
Output:
stored as ["something ""including escaped quotes"" cool"]
written out [something "including escaped quotes" cool]
Upvotes: 0
Reputation: 71
You can use below code to remove double quotes from string in C++.
stringVariable.erase(
std::remove(stringVariable.begin(), stringVariable.end(), '\"'),
stringVariable.end());
Upvotes: 2
Reputation: 4441
remove requires the algorithm
header and is from std
namespace
I do find the C++ Reference very helpful for quickly getting usage examples and what headers are required. It may not have complete information for some things but it helps as a good start if I am not sure about how to use some parts of C Library, stream Library, strings library, STL Containers or STL Algorithms
Upvotes: 1
Reputation: 73443
remove
is algorithm, hence you need to do #include <algorithm>
. Then while using you should use it as std::remove(...)
.
Upvotes: 1
Reputation: 76788
Do you have stdio.h
included? Then there could be a conflict with remove
. This is the reason why you always should prefix std
-calls with, well, std::
.
Upvotes: 4
Reputation: 44706
Don't you want something like:
s.erase(remove( s.begin(), s.end(), '\"' ),s.end());
As remove
returns "A forward iterator pointing to the new end of the sequence, which now includes all the elements with a value other than value" rather than removing the values.
It compiles fine for me though (with gcc 4.4), so perhaps you just need to include <algorithm>
and make sure you are either using namespace std
or qualify the name.
Upvotes: 14