читать строку / символ / данные после определенной искомой строки в той же строке только из текстового файла, используя переполнение стека

У меня есть текстовый файл и содержание:

# Details for object 1 ("PASperson")
# Center point -- not available in other PASCAL databases -- refers
# to person head center
Original label for object 1 "PASperson" : "UprightPerson"Center point on object 1 "PASperson" (X, Y) : (281, 169)
Bounding box for object 1 "PASperson" (Xmin, Ymin) - (Xmax, Ymax) : (250, 151) - (299, 294)

# Details for object 2 ("PASperson")
# Center point -- not available in other PASCAL databases -- refers
# to person head center
Original label for object 2 "PASperson" : "UprightPerson"Center point on object 2 "PASperson" (X, Y) : (247, 373)
Bounding box for object 2 "PASperson" (Xmin, Ymin) - (Xmax, Ymax) : (215, 354) - (274, 466)

Теперь я хочу получить значение Xmin Ymin Xmax Ymax и использовать его в моей программе на С ++, чтобы сравнить эти координаты с моей недавно сгенерированной координатой. Так как это сделать. Я могу получить строку «Xmax, Ymax» из текстового файла, но я не знаю, как читать после этого, чтобы получить координаты. Мой код для поиска строки:

int main()
{
std::string data;
ifstream read_file("crop001501.txt",ios::in);
char *search="Xmax, Ymax";
int offset;
while(std::getline(read_file ,data))
{
//read_file>>data;
//cout<<data<<endl;
if ((offset = data.find(search, 0)) != string::npos) {
cout << "found '" << search << endl;}
}
cin.get();
return 0;
}

Эта программа ищет строку Xmax, Ymax в каждой строке и, когда она найдена, печатается. но я хочу указатель этой строки, чтобы я мог увеличить значение указателя и прочитать значение Xmin, затем пропустить, и прочитать значение Ymin, а затем пропустить) — и прочитать значение Xmax и то же самое для Ymax. После получения значения перейдите к следующей строке и сделайте то же самое. Если кто-нибудь знает какой-либо другой метод для чтения этих значений, то, пожалуйста, скажите мне, мне не нужны значения X, Y. Если любая ошибка, то извините, я новичок здесь. заранее спасибо

0

Решение

#include <iostream>
#include <string>
#include <regex>
#include <cassert>
#include <chrono>
#include <sstream>

using namespace std;

int main(void){

string line("Bounding box for object 1 \"PASperson\" (Xmin, Ymin) - (Xmax, Ymax) : (250, 151) - (299, 294)");

// METHOD 1 - using regular expressions
{
regex e("object ([[:digit:]]+) \"PASperson\" \\(Xmin, Ymin\\) - \\(Xmax, Ymax\\) : \\(([[:d:]]+), ([[:d:]]+)\\) - \\(([[:d:]]+), ([[:d:]]+)\\)");

smatch m;

bool found = regex_search(line, m, e);

if (found == true){
assert(m.size() == 6);

int object_id, xmin, xmax, ymin, ymax;

object_id = stoi(m[1]);
xmin = stoi(m[2]);
ymin = stoi(m[3]);

xmax = stoi(m[4]);
ymax = stoi(m[5]);

cout << "Object ID = " << object_id << endl;
cout << "Xmin = " << xmin << endl;
cout << "Ymin = " << ymin << endl;
cout << "Xmax = " << xmax << endl;
cout << "Ymax = " << ymax << endl;
}
}

// METHOD 2 : using stringstream
{
istringstream ss(line);
int object_id;
string xmin_s, xmax_s, ymin_s, ymax_s;
string other;
ss >> other; ss >> other; ss >> other; ss >> other; // ignore 4 words
ss >> object_id;
ss >> other; ss >> other; ss >> other; ss >> other; ss >> other; ss >> other; ss >> other;  // ignore 7 words
ss >> xmin_s; ss >> ymin_s;
ss >> other; // ignore -
ss >> xmax_s; ss >> ymax_s;

// get rid of leading/trailing symbols (,)
xmin_s.erase(xmin_s.begin()); xmin_s.erase(xmin_s.end() - 1);
xmax_s.erase(xmax_s.begin()); xmax_s.erase(xmax_s.end() - 1);
ymin_s.erase(ymin_s.end() - 1);
ymax_s.erase(ymax_s.end() - 1);

int xmin, xmax, ymin, ymax;

// convert strings to integers
xmin = stoi(xmin_s);
ymin = stoi(ymin_s);
xmax = stoi(xmax_s);
ymax = stoi(ymax_s);

cout << "Object ID = " << object_id << endl;
cout << "Xmin = " << xmin << endl;
cout << "Ymin = " << ymin << endl;
cout << "Xmax = " << xmax << endl;
cout << "Ymax = " << ymax << endl;
}
}
0

Другие решения


По вопросам рекламы [email protected]