如何将带冒号的输入文件读入数组?

时间:2018-01-24 03:53:47

标签: c++

我正在尝试将输入文件读入数组或结构。

我不确定要通过以冒号分隔的日期部分进行导航。

这个问题可能非常广泛,我可以提供任何帮助。

这是我的功能:

void optionMammal (ifstream& inFile1)
{
    int mamNum;

    inFile1>>mamNum;
    mammal mamInfo [mamNum];

    initializeInfo(mamInfo, mamNum);

    for (int i=0; i<mamNum; i++)
    {

        inFile1>>mamInfo[i].species
               >>mamInfo[i].dateOfBirth.month
               >>mamInfo[i].dateOfBirth.day
               >>mamInfo[i].dateOfBirth.year
               >>mamInfo[i].weight
               >>mamInfo[i].enclosureSize.length
               >>mamInfo[i].enclosureSize.width
               >>mamInfo[i].enclosureSize.height
               >>mamInfo[i].exhibit;

           cout<<mamInfo[i].species
               <<mamInfo[i].dateOfBirth.month
               <<mamInfo[i].dateOfBirth.day
               <<mamInfo[i].dateOfBirth.year
               <<mamInfo[i].weight
               <<mamInfo[i].enclosureSize.length
               <<mamInfo[i].enclosureSize.width
               <<mamInfo[i].enclosureSize.height
               <<mamInfo[i].exhibit;
    }
}

这是输入文件。 文件中数字或哺乳动物的第一个数字,它应该是犀牛上面的一行。

15
Rhino 01:16:2000 5100 100:260:50 Africa
Lion 05:14:2006 420 150:64:55 Africa
Tapir 10:21:2015 550 90:50:30 Asia
Otter 09:08:2011 7 50:30:20 Americas
Fox 06:03:2013 6 30:25:34 Americas
Sheep 11:10:2004 200 50:50:20 Europe
Vole 12:06:2014 1 1:2:2 Europe
Cheetah 06:12:2003 80 30:30:20 Africa
Hedgehog 07:18:2006 1 2:2:3 Europe
Serval 08:22:2007 26 10:20:4 Africa
Shrew 08:23:2015 1 2:2:3 Europe
Bat 06:25:2016 2 6:7:15 Europe
Rabbit 04:23:2015 3 3:3:2 Europe
Seal 08:26:2014 200 50:50:20 Antartica
Dolphin 09:01:2017 330 200:200:60 Antartica

3 个答案:

答案 0 :(得分:1)

输入真的不像人们喜欢的那么简单。如果那里有冒号,你应该阅读它。幸运的是,你的输入让生活变得非常非常简单。

首先,您需要在输入的适当位置预期冒号,如果不存在则会失败。为它编写一个提取器,你的哺乳动物提取操作符如下:

struct expect
{ 
  char c; 
  expect( char c ): c(c) { }
};

std::istream& operator >> ( std::istream& ins, const expect& c )
{
  ins >> std::ws;
  if (ins.peek() == c.c) ins.get();
  else                   ins.setstate( std::ios::failbit );
  return ins;
}

std::istream& operator >> ( std::istream& ins, Mammal& mammal )
{
  return ins 
    >> mammal.species
    >> mammal.dateOfBirth.month    >> expect( ':' )
    >> mammal.dateOfBirth.day      >> expect( ':' )
    >> mammal.dateOfBirth.year
    >> mammal.weight
    >> mammal.enclosureSize.length >> expect( ':' )
    >> mammal.enclosureSize.width  >> expect( ':' )
    >> mammal.enclosureSize.height
    >> mammal.exhibit;
}

现在你可以通常的方式阅读哺乳动物:

std::vector <Mammal> mammals;

int num_mammals;
std::cin >> num_mammals;

Mammal mammal;
while (std::cin >> mammal)
  mammals.push_back( mammal );

或者,使用数组

Mammal mammals[ MAX_MAMMALS ];
int num_mammals = 0;

std::cin >> num_mammals;
if (num_mammals > MAX_MAMMALS) complain();

for (int n = 0; n < num_mammals; n++)
  std::cin >> mammals[ n ];

等等。

答案 1 :(得分:0)

看起来您文件中的第一个数字是您需要解析的动物数量。其余部分是重复的,所以我只是在一个while循环中解析它,其中空格在变量之间划分。当您到达包含笼子尺寸的冒号的部分时,只需使用字符串流将其分解为单个部分。免责声明:有更好的方法可以做到这一点(练习留给读者),但这应该给你的想法。

std::ifstream myfile("animals.txt");
if (myfile.is_open())
{
    int numberOfAnimals;
    myfile >> numberOfAnimals;
    std::string temp;
    while (myfile >> temp))
    {
        // string variables processed here
        // ...

        bool isNumber = (temp.find_first_not_of("0123456789") == std::string::npos);
        if (isNumber)
        {
            // use std::stoi() or std::stringstream to
            // convert actual number to int type
        }

        // logic to parse colon variables as needed here
        std::size_t found = temp.find_first_of(":");
        if (found > 0)
        {
            std::istringstream iss(temp);
            std::string token;
            while (std::getline(iss, token, ':'))
            {
                std::istringstream tss(token);
                int n;
                while (tss >> n)
                {
                    std::cout << n << std::endl;
                }
            }
        }
    }
}

答案 2 :(得分:0)

只需阅读结肠并忘记它。

void optionMammal (ifstream& inFile1)
{
    int mamNum;

    inFile1>>mamNum;
    mammal mamInfo [mamNum];

    initializeInfo(mamInfo, mamNum);

    for (int i=0; i<mamNum; i++)
    {
        char colon;
        inFile1>>mamInfo[i].species
               >>mamInfo[i].dateOfBirth.month >> colon
               >>mamInfo[i].dateOfBirth.day >> colon
               >>mamInfo[i].dateOfBirth.year
               >>mamInfo[i].weight
               >>mamInfo[i].enclosureSize.length >> colon
               >>mamInfo[i].enclosureSize.width >> colon
               >>mamInfo[i].enclosureSize.height
               >>mamInfo[i].exhibit;

           cout<<mamInfo[i].species
               <<mamInfo[i].dateOfBirth.month
               <<mamInfo[i].dateOfBirth.day
               <<mamInfo[i].dateOfBirth.year
               <<mamInfo[i].weight
               <<mamInfo[i].enclosureSize.length
               <<mamInfo[i].enclosureSize.width
               <<mamInfo[i].enclosureSize.height
               <<mamInfo[i].exhibit;
    }
}