Как я могу прочитать числа из специально отформатированного потока строк? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть огромный файл, который содержит геометрические объекты с их координатами рядом с ними.формат выглядит следующим образом: прямоугольник, (42,25), (68,25), (68,70), (42,70)

Я хочу прочитать каждое число отдельно и сохранить его в массиве какПозже я обработаю эти данные, чтобы найти области фигур и периметры.

string line = ""; // A string for reading lines from the text file
ifstream readFile("Input_Points.txt"); // Opening the input file

string name = ""; // A string to store the type of the shape

while(getline(readFile,line))  { 
    // Loop through the file lines
    stringstream iss(line); // Instantiate stringstream with the current line just read
    getline(iss, name, ','); // Parse token until the first comma and store it in name
    Shape * obj = gobj[name]; //Fetch the corresponding object from map using name
    if ( obj != NULL )  { 
        // If it can find an object with name index
        obj = obj->clone(iss); // Clone an object of the same type               
        cout << name << ":" << obj->area() << ":" << obj->perimeter() << "\n";  // Calculate area and print it
        delete (obj); // delete the object 
    } 
    else 
        cout << "Undefined Object Identifier\n"; // Cannot find object type in map
}

и две функции, которыми я управляю данными

void Square::initialize (stringstream & ss) 
{
    for (int i = 0; i < 2; i++) {
        sscanf(ss,",(%lf,%lf)", points[i].X, points[i].Y);
    }
    for (int i = 0; i < 2; i++) {
        LineLength[i] = points[(i + 1)%2] - points[i];
    }
}

Shape * Square::clone (stringstream & ss) { //can be done with templates 
    Square * square = new Square();
    square->initialize(ss);
    return square;
}

sscanf не делает то, что я хочу здесь, и я провел большой поиск и не смог найтичто-то похожее, что выполняет то, что я хочу сделать на строковых потоках.

1 Ответ

2 голосов
/ 10 апреля 2019

Мое предложение:

  1. Заменить все посторонние символы пробелами в строке.
    (, ) и , могут быть заменены пробелом.
  2. Извлечение чисел из упрощенной строки.

На первом шаге "rectangle,(42,25),(68,25),(68,70),(42,70)" можно преобразовать в "rectangle 42 25 68 25 68 70 42 70 ".

Чтение чиселиз такой строки прямолинейно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...