Повторение текста в файле - проблемы с циклом - PullRequest
0 голосов
/ 18 декабря 2018

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

file >> someData >> someData2;
if(someData appeared for the 1st time)                
            {
                add someData to list;
            }
else
            add someData2 to list2;

Я знаю, как все делать внутри циклов, но условие внутри if проблематично, так как программа не запоминает ранее прочитанные данные.

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Использовать Стандартные библиотечные контейнеры .Они делают почти всю работу за вас.

#include <iostream>
#include <string>
#include <set>
#include <sstream>
#include <vector>

int main()
{
    std::istringstream file("A B1 C D1 A B2 C D2"); // fake input file in memory

    std::string someData; // assuming strings because they are easy
    std::string someData2;

    std::set<std::string> list1; 
    std::vector<std::string> list2;

    while (file >> someData >> someData2) // read in inputs until end or failure
                                          // note: Not handling failures
    {
        auto result = list1.insert(someData); // attempt to add to list1
        if(! result.second) // if already in set
        {
            list2.push_back(someData2); // add to list2
        }
    }

    // print contents of lists
    for (const auto & out: list1)
    {
        std::cout << out << ' ';
    }
    std::cout << '\n';
    for (const auto & out: list2)
    {
        std::cout << out << ' ';
    }
}

Документация для std::set

Документация для std::vector

Документация для std::istringstream

0 голосов
/ 18 декабря 2018

Что ж, как указано в комментариях, подход STL заключается в использовании 'std :: set';Ради тщательности я проиллюстрирую, как использовать как std :: set, и как использовать простой C;

C ++

// initial 'list' setup
std::set<decltype(someData)> listA;
std::vector<decltype(someData2)> listB;

// filling in data
file >> someData >> someData2;

// Insert the data into the set
// if the value already exists, leave it alone and push an element into listB
if(!listA.insert(someData).second) listB.push_back(someData2);

C

// some dynamically allocated arrays
char * listA;
unsigned listAsize;
char * listB;
unsigned listBsize;

// data variables (chars, for simplicity)
char dataA;
char dataB;

// loop variable
unsigned i;

// read data
readMyData(&dataA, &dataB);

// insert conditionally into lists
for(i = 0; i < listAsize; ++i) {
  if(list[i] == dataA) {
     // insert dataB into list B
     break;
  }
}

if(i == listAsize) {
  // insert dataA into listA
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...