У меня есть следующий код, который использует strtok, который получает входные данные из текстового файла. Входные данные в текстовом файле:
age, (4, years, 5, months)
age, (8, years, 7, months)
age, (4, years, 5, months)
Мой код выглядит так:
char * point;
ifstream file;
file.open(file.c_str());
if(file.is_open())
{
while(file.good())
{
getline(file, take);
point = strtok(&take[0], ", ()");
}
}
У него все хорошо, за исключением вывода 2-го и 3-го возраста. Может кто-нибудь сказать мне, почему они отсутствуют?
Тоже попробовал istringstream
но всякий раз, когда я ввожу свое имя файла, программа вылетает.
char * point;
char take[256];
ifstream file;
file.open(file.c_str());
if(file.is_open())
{
while(file.good())
{
cin.getline(take, 256);
point =strtok(take,", ()");
}
}
Лично я бы использовал std::istringstream
но я бы использовал это по-другому (… и, да, я знаю, что я мог бы использовать sscanf()
а также то, что код будет короче, но мне не нравится небезопасный интерфейс)! Я бы поиграл с манипуляторами
#include <iostream>
#include <sstream>
#include <string>
template <char C>
std::istream& skip(std::istream& in)
{
if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type(C)) {
in.setstate(std::ios_base::failbit);
}
return in.ignore();
}
std::istream& (*const comma)(std::istream&) = &skip<','>;
std::istream& (*const open)(std::istream&) = &skip<'('>;
std::istream& (*const close)(std::istream&) = &skip<')'>;
struct token
{
token(std::string const& value): value_(value) {}
std::string::const_iterator begin() const { return this->value_.begin(); }
std::string::const_iterator end() const { return this->value_.end(); }
std::string value_;
};
std::istream& operator>> (std::istream& in, token const& t)
{
std::istreambuf_iterator<char> it(in >> std::ws), end;
for (std::string::const_iterator sit(t.begin()), send(t.end());
it != end && sit != send; ++it, ++sit) {
if (*it != *sit) {
in.setstate(std::ios_base::failbit);
break;
}
}
return in;
}
int main()
{
std::istringstream input("age, (4, years, 5, months)\n""age , ( 8 , years , 7, months )\n""age, (4, year, 5, months)\n""age, (4, years 5, months)\n""age (4, years, 5, months)\n""age, 4, years, 5, months)\n""age, (4, years, 5, months)\n");
std::string dummy;
int year, month;
for (std::string line; std::getline(input, line); ) {
std::istringstream lin(line);
if (lin >> token("age") >> comma
>> open
>> year >> comma >> token("years") >> comma
>> month >> comma >> token("months") >> close) {
std::cout << "year=" << year << " month=" << month << "\n";
}
}
}
Других решений пока нет …