Проверьте, есть ли значение из строки в массиве, если нет, то добавьте его - PullRequest
0 голосов
/ 07 января 2020

Итак, у меня много строк, которые выглядят так:

!,3,1,10,27,13,078,43,05,31,307,48,16,24,042,43,02,10,267,43
!,3,2,10,26,03,031,36,07,75,215,51,09,57,121,53,30,40,234,50
!,3,3,10,23,29,117,46,04,36,114,46
!,3,1,10,27,13,078,43,05,31,307,48,16,24,042,43,02,10,267,43
!,3,2,10,26,03,031,36,07,75,215,51,09,57,121,53,30,40,234,50
!,3,3,10,23,29,117,46,04,36,114,46

Мне нужно вывести некоторые значения из строки после определенного количества запятых. Но только если они появляются впервые. Известно, что число значений меньше 100. Я справился с той частью кода, которая выводит значения из строки, но я не могу справиться со второй частью задачи. Я создал массив из 100 элементов, выполнил поиск с помощью команды std :: find и добавил значение, если оно отсутствует в массиве, но вывод программы неверен. Также мне нужно решить эту задачу без использования векторов: /

Я пробовал это так:

#include <iostream>
#include <string>
#include <fstream>

int main() {
    int k;
    std::string line;
    std::ifstream logs_("C:/Users/Ivan/Desktop/gpgga.txt"); 
    std::ofstream pout("C:/Users/Ivan/Desktop/outLOG.txt"); 


    int num = 100;
    int* Memory = new int[num];
    bool ExitFlag;

    if (logs_.is_open()) {
        while (getline(logs_, line)) {
            k = 0;
                for (size_t i = 0, N = 4; i < line.size(); i++) {
                    if (line[i] == ',') k++;
                    if (k == N) {
                        N += 4;
                        for (int f = 0; f < num; f++) {
                            if (Memory[f] != stoi(line.substr(i + 1, 2))) {
                                ExitFlag = false;
                                Memory[f] = stoi(line.substr(i + 1, 2));
                            }
                        }
                        if (ExitFlag == false) {
                            pout << "Satellite name: " << line.substr(i + 1, 2) << std::endl;
                        }
                    }
                }

            logs_.close();
            std::cout << "Success" << std::endl;
        }
    }
    else std::cout << "File is not open" << '\n';
    pout.close();
    return 0;
}

Но ничего не выводится

Вот еще одна попытка:

#include <iostream>
#include <string>
#include <fstream>

int main() {
    int k;
    std::string line;
    std::ifstream logs_("C:/Users/Ivan/Desktop/gpgga.txt"); 
    std::ofstream pout("C:/Users/Ivan/Desktop/outLOG.txt"); 


    int array[100];
    int size = sizeof(array) / sizeof(array[0]);

    if (logs_.is_open()) {
        while (getline(logs_, line)) {
            k = 0;
            for (size_t i = 0, N = 4; i < line.size(); i++) {
                if (line[i] == ',') k++;
                if (k == N) {
                    for (int j = 0; j < size; j++) {
                        int* foo = std::find(std::begin(array), std::end(array), stoi(line.substr(i + 1, 2)));
                        if (foo = std::end(array)) {
                            pout << "Number: " << line.substr(i + 1, 2) << "  ";
                            array[j] = stoi(line.substr(i + 1, 2));
                        }
                    }
                    N += 4;
                }
            }
            logs_.close();
            std::cout << "Success" << std::endl;
        }
    }
    else std::cout << "File is not open" << '\n';
    pout.close();

    return 0;
}

В теории программа должна выводить 27, 05, 16, 02, 26, 07, 09, 30, 23, 04

Токовый выход: Номер: 27 Номер: 27 Номер: 27 Номер: 27 Номер: 27 ... 100 раз Номер: 05 Номер: 05 Номер: 05 Номер: 05 Номер: 05 Номер: 05 Номер: 05 Номер: 05 ... 100 раз и они повторяются

1 Ответ

0 голосов
/ 08 января 2020

Спасибо пользователю Slava std :: unordered_set сработало

#include <unordered_set>
...
    std::unordered_set<int> S;
    int t;
...
for (size_t i = 0, N = 4; i < line.size(); i++) {
                            if (line[i] == ',') k++;
                            if (k == N) {
                                t = stoi(line.substr(i + 1, 2));
                                if (S.find(t) == S.end()) {
                                    pout << "Number " << t << "  " << std::endl;
                                    S.insert(t);
                                }

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