在文件中重复文本-循环问题

时间:2018-12-18 19:51:09

标签: c++ loops if-statement

我希望程序从文件中读取一些内容,但是仅当元素第一次出现时才将新元素添加到列表中。我的问题是我不知道如何检查。循环看起来像这样:

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

我知道如何执行循环内的所有操作,但是if内的条件是有问题的,因为程序不记得以前读取的数据。

我的想法是:检查列表中的每个元素或使用一个临时选项卡,该标签将存储someData并在函数结束后消失。

2 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,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
}

答案 1 :(得分:0)

使用Standard library containers。他们几乎为您完成所有工作。

#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 << ' ';
    }
}

Documentation for std::set

Documentation for std::vector

Documentation for std::istringstream