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

Repeating text in file - problems with a loop

本文关键字:循环 问题 文本 文件      更新时间:2023-10-16

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

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

我知道如何在循环内完成所有操作,但是if内的状况是有问题的,因为该程序不记得先前读取数据。

我的想法是:检查列表的每个元素或使用临时选项卡,该选项卡存储有一天,并且在功能结束后将消失。

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

使用标准库容器。他们几乎为您做所有的工作。

#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

的文档