我正在尝试将输入文件读入数组或结构。
我不确定要通过以冒号分隔的日期部分进行导航。
这个问题可能非常广泛,我可以提供任何帮助。
这是我的功能:
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
答案 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;
}
}