Необычное разбиение строки

98
09 сентября 2019, 16:20

Имеется программа для разбиения строки по регулярному выражению (парсинг). Программа читает строку из файла, разбивает по ";", вписывает в вектор типа структура и выводит на экран. Проблема в том, что программа почему-то дважды записывает одно и то же. Как я могу решить свою проблему? Спасибо. Код и скрины прилагаются.

#include "pch.h"
#include <iostream>
#include <vector>
#include <string.h>
#include <io.h>

using namespace std;
struct pointXY
{
    char *x;
    char *y;
};
pointXY *dot;
int main()
{
    dot = new pointXY;
    FILE *file;
    fopen_s(&file, "poly.txt", "r");
    if (file!=NULL)
    {
        int count = 0;
        long sz;
        fseek(file, 0, SEEK_END);
        sz = ftell(file)+1;
        fseek(file, 0, SEEK_SET);
        char *read, *pars;
        read = new char[sz];
        fgets(read, sz, file);
        pars = strtok(read, ";");
        vector<pointXY> pole;
        while (pars != NULL)
        {
            if (count % 2 == 0)
            {
                dot->x = pars;
                pole.push_back(*dot);
            }
            else
            {
                dot->y = pars;
                pole.push_back(*dot);
            }
            pars = strtok(NULL, ";");
            count++;
        }
        for (int i = 0; i < count/2; i++)
        {
            cout << pole[i].x << " -- " << pole[i+1].y << endl;
        }
    }
    else
    {
        cout << "Open Error";
    }
}

Answer 1

Это можно сделать проще. Например:

using namespace std;
ifstream file("poly.txt");
vector<string> vs;
string s;
while   (getline(file, s, ';'))
    vs.push_back(s);
for (int i = 1; i < vs.size(); i += 2)
    cout << vs[i - 1] << " -- " << vs[i] << endl;
Answer 2

Ваш странный цикл чтения создает в памяти вектор таких пар

{ 0, мусор }
{ 0, 1 }    
{ 2, 1 }
{ 2, 3 }
{ 4, 3 }
{ 4, 5 }
{ 6, 5 }
{ 6, 7 }
{ 8, 7 }
{ 8, 9 }

После чего вы выводите первые пять по [странному] диагональному правилу pole[i].x -- pole[i+1].y. (Видимо странность вывода должна компенсировать странность чтения.)

Получается то, что получается. Что написали, то и получили.

Зачем понадобился такой странный цикл чтения и странный вектор в результате - не ясно. Но чтобы из него "выцарапать" пары исходных "координат" вашим странным способом вывода (т.е. для того, чтобы странность вывода действительно скомпенсировала странность чтения), вам придется выводить данные с шагом i += 2, а не i++. И не до i < count / 2, а до i < count.

Но я бы предположил, с точки зрения здравого смысла, что исходный замысел все таки состоял в формировании вектора

{ 0, 1 }    
{ 2, 3 }
{ 4, 5 }
{ 6, 7 }
{ 8, 9 }

при чтении. А для этого надо переделывать все.

READ ALSO
Создание метода класса

Создание метода класса

Имеется класс, полем которого является структура, а один из методов это работа с этой структуройПри инициализации метода ругается на неправильное...

125
Проблемы с коррекцией движения объекта

Проблемы с коррекцией движения объекта

Хочу сделать что-то типа джойстика на андроидеЕсть квадратный тип и круглый тип

96
JavaFX 11 + Eclipse

JavaFX 11 + Eclipse

Ранее я использовал Java 8 , где была включена JavaFXХочу настроить работу JavaFX 11 используя Eclipse

136
Angular 6 + Spring Boot. Некорректная загрузка приложения

Angular 6 + Spring Boot. Некорректная загрузка приложения

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

124