Посимвольный ввод из файла, в C ++ - PullRequest
1 голос
/ 07 октября 2010

Есть ли способ получить входные данные из файла по одному номеру за раз? Например, я хочу сохранить следующее целое число в векторе целых чисел, так как оно очень длинное и не может удерживаться даже длинным длинным целым.

12345678901234567900

Так как я могу прочитать это число из файла, чтобы я мог:

vector<int> numbers;
number.push_back(/*>>number goes here<<*/)

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

Спасибо, заранее, Дэн Шевалье

Ответы [ 3 ]

1 голос
/ 07 октября 2010

Это может быть сделано различными способами, все они сводятся к преобразованию каждого символа '0' .. '9' в соответствующее целое число 0..9. Вот как это можно сделать с помощью одного вызова функции:

#include <string>
#include <iostream>
#include <vector>
#include <iterator>
#include <functional>
#include <algorithm>
int main()
{
        std::string s = "12345678901234567900"; 
        std::vector<int> numbers;
        transform(s.begin(), s.end(), back_inserter(numbers),
                  std::bind2nd(std::minus<char>(), '0'));
        // output
        copy(numbers.begin(), numbers.end(),
             std::ostream_iterator<int>(std::cout, " "));
        std::cout << '\n';
}

При чтении из файла вы можете прочитать строку и transform () или даже transform () напрямую из итераторов istream, если в этом файле нет ничего кроме вашего номера:

    std::ifstream f("test.txt");
    std::vector<int> numbers;
    transform(std::istream_iterator<char>(f),
              std::istream_iterator<char>(),
              back_inserter(numbers),
              std::bind2nd(std::minus<char>(), '0'));
0 голосов
/ 07 октября 2010

Вверху моей головы это должно заполнить массив символов, который вы можете затем перебрать.Я понимаю, что это не совсем то, что вы хотели, но это мой предпочтительный метод.

void readfile(char *string)
{
    ifstream NumberFile; 
    NumberFile.open("./Number"); //For a unix file-system
    NumberFile >> string;
    NumberFile.close();
}

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

0 голосов
/ 07 октября 2010

Вы можете прочитать символ за раз с помощью char c; cin.get(c); и преобразовать его в число с помощью c -= '0'. Но, возможно, вы можете просто прочитать его как строку или использовать что-то вроде BigNum .

...