在文本文件中,我有几行,每行看起来像下面一行(不同的数字)。
[275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56]
说到一行,我想分别得到每一点。
例如:
[275, 61]
[279, 56]
[285, 54]
然而,当我尝试以下内容时;
istringstream linestream(line);
while (getline (linestream, item, ','))
{
...............
}
它给我的是:
first [275
and then 61]
next [279
等
有人能告诉我如何修改while
循环以便获得所需的输出吗?
答案 0 :(得分:2)
您看到的行为是预期的行为,因为您的定界符为','。如果你想分隔每一秒','你需要将你的标记连接两个两个。
例如“[275”+“,”+“61]”
考虑到你当前的输出,你应该可以通过简单的for循环来实现这一点。
答案 1 :(得分:1)
您使用getline
时遇到的行为是正确的,因为您要使用,
分隔。
为了获得所需的行为,如果您的编译器支持C ++ 11,您可以使用正则表达式库(即regex
),如下例所示:
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string str("[275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56]");
std::regex e("\\[\\s*\\d+\\s*\\,\\s*\\d+\\s*\\]");
std::smatch sm;
std::regex_search(str, sm, e);
std::cout << "the matches were: ";
while (std::regex_search(str, sm, e)) {
for(auto x : sm) std::cout << x << " ";
std::cout << std::endl;
str = sm.suffix().str();
}
}
答案 2 :(得分:-3)
假设文字是连贯的(没有错过&#39; [&#39;或&#39;]&#39;)您可以手动搜索&#39; [&#39;和&#39;]&#39;的位置,然后您可以复制它们之间的子字符串以进行进一步分析。 以下代码演示了如何提取和打印这些子字符串:
#include <stdio.h>
#include <string.h>
void main()
{
const char* test=" [275, 61],[279, 56],[285, 54],[292, 55],[298, 57],[315, 57],[321, 54],[328, 54],[335, 56] ";
char pair[20];
int i,pos1,pos2;
for (i=0,pos1=0,pos2=0; test[i]>0; i++)
{
if(test[i]=='[') pos1=i; //searching for '['
if(test[i]==']') pos2=i; //searching for ']'
//if(test[i]==']') printf("%.*s\n", pos2-pos1+1, test + pos1); //direct print from memory
if(test[i]==']') strncpy_s(pair,sizeof(pair), test + pos1, pos2-pos1+1); // copy result sub-string to "pair"
if(test[i]==']') printf("%s\n", pair); //print result on screen
}
}