我的要求如下所述。 我正在读取包含
的stringstream对象中的文件"NECK_AP \
UL, 217.061, -40.782\n\
UR, 295.625, -40.782\n\
LL, 217.061, 39.194\n\
LR, 295.625, 39.194".
当我试图填充变量中的值时,我也会得到“,”以及它。可以任何人建议,以便我可以将所有这些值存储在相应的变量中,而不是“,”
只是一个帮助这种情况的示例代码:
int _tmain(int argc, _TCHAR* argv[])
{
char pause;
stringstream stream;
stream.str("NECK_AP \
UL, 217.061, -40.782\n\
UR, 295.625, -40.782\n\
LL, 217.061, 39.194\n\
LR, 295.625, 39.194");
string value1,value2,value3,value4;
stream >> value1>>value2>>value3>>value4;
cout << value1<<value2<<value3<<value4<<endl;
cin >> pause;
return 0;
}
NECT_AP UL,217.061,-40.782
NECT_AP UL 217.061 -40.782
答案 0 :(得分:0)
您需要了解函数(或运算符等)(大多数时候)是为了完成某项工作而编写的。运营商&gt;&gt;有从数据流到某个地方获取数据的工作。这是它的工作,它应该是这个。您想要做的是编写新功能(或使用现有功能),稍后将根据您的需要更改值。
借助标准库可以轻松实现您想要做的事情:
#include <algorithm>
//some code...
std::replace_if(value1.begin(), value1.end(), [](char x){return x == ',';}, ' ');
为每个值做这件事。或者,将所有内容加载到一个字符串中,对此字符串使用此函数,然后打印其内容。 它有什么作用? replace_if有四个参数:容器的开始和结束迭代器(前两个参数),一些谓词函数(我使用所谓的lambda表达式,或匿名函数;但你可以编写单独的函数并提供它的名字,没问题!),以及新的价值。基本上它可以被翻译为“用''替换字符串中的每个字符,如果它符合谓词(换句话说,是冒号)。
答案 1 :(得分:0)
你可以这样做。 operator>>
std::string
跳过空白字符,然后将字符读入提供的变量,直到它到达另一个空白字符。
该流具有关联的区域设置,用于确定哪些字符被视为“白色空间”或不被视为“空白区域”。我们可以编写自己的语言环境,将,
分类为'white-space`,告诉流使用该语言环境,并根据需要读取我们的数据。
为了简单起见,我编写了一些代码,只是将所有字符串读入一个向量,然后显示它在自己的行上读取的每个字符串,这样就可以很容易地看到它读入每个字符串的内容。 / p>
#include <locale>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <iostream>
struct reader: std::ctype<char> {
reader(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::mask());
rc[','] = std::ctype_base::space;
rc['\n'] = std::ctype_base::space;
rc[' '] = std::ctype_base::space;
return &rc[0];
}
};
int main() {
std::istringstream infile("NECK_AP \
UL, 217.061, -40.782\n\
UR, 295.625, -40.782\n\
LL, 217.061, 39.194\n\
LR, 295.625, 39.194");
infile.imbue(std::locale(std::locale(), new reader));
std::vector<std::string> d { std::istream_iterator<std::string>(infile),
std::istream_iterator<std::string>() };
std::copy(d.begin(), d.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}