Как читать и отделять целые числа, такие как "100_4_1 - 15" - PullRequest
2 голосов
/ 13 марта 2012

Это действительно просто в некоторых языках, не так просто в других.Я не могу получить это для C ++.Я читаю в файле с тысячами строк формата в заголовке вопроса и читаю этот файл снова и снова тысячи раз.

В принципе, в моей программе, скажем, есть целые числа«100, 4, 1», и я хочу посмотреть в текстовом файле, какая последняя цифра в последовательности, поэтому строка может быть «100_4_1 - 15», я хочу получить 15.Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

некоторые целые числа в моей программе, скажем "100, 4, 1", "100_4_1 - 15", я хочу получить 15

struct Key
{
    int a_, b_, c_;
    Key(int a, int b, int c) : a_(a), b_(b), c_(c) { }
    bool operator<(const Key& rhs) const
    {
        return a_ < rhs.a_ ||
               a_ == rhs.a_ && b_ < rhs.b_ ||
               a_ == rhs.a_ && b_ == rhs.b_ && c_ < rhs.c_;
    }
};

typedef std::map<Key, int> Lookup_Table;
Lookup lookup_table;

if (std::ifstream if("filename.txt"))
{
    int a, b, c;
    char ignore_char;
    int number;
    while (if >> a >> ignore_char >> b >> ignore_char >> c >> ignore_char >> number)
        lookup_table[Key(a, b, c)] = number;
}
else
{
    std::cerr << "can't read input file...\n";
    exit(1);
}

// to find something:
Lookup_Table::const_iterator i = lookup_table.find(Key(x, y, z));
if (i != lookup_table.end())
{
    // found... value accessible using *i...
}
1 голос
/ 13 марта 2012

Это будет зависеть от самих чисел ... Является ли этот файл, похожий на 10000, просто одним фиксированным файлом?

Если бы он был, например, и он имел 3 целых числа индекса и целое число, котороевам нужно искать, было бы просто загрузить все это в память и искать его всякий раз, когда это необходимо.

в C / C ++ простой массив структур будет делать это хорошо, например:

#define NUMELEMENTS 1000

struct Element {
    int x;
    int y;
    int z;
    int v;
};

class Elements{
    elements Element[NUMELEMENTS];
    public:
    int findElement(int,int,int);
    void loadElements;

} E;

Затем я использовал бы E.FindElement (100,4,1) и получил бы 15.

loadElements загрузил бы файл, читая построчно и разделяя числа (я бычитать строку, удалять пробелы, унифицировать дефисы и подчеркивания и получать числа между разделителями.

findElement будет просто проходить по элементам ... для элементов 10k я бы не стал беспокоиться об оптимизации, если бы он не работална встроенном устройстве.

...