2012-01-05 5 views
0

В C++, как я могу создать файл чисел, не отнесенных к массиву?C++ cin из файла с неустановленными номерами

Например, 78940725450327458, как можно разместить эти числа, чтобы список [0] = 7, список [1] ​​= 8, список [2] = 9 и т. Д.

+0

Это домашнее задание? – dasblinkenlight

+0

Нет его для проекта euler – Sean

ответ

0

Составьте список из массива char s.

cin >> list[0] будет читать один символ.

+1

За исключением того, что похоже, что Шон хочет числовые значения; если это так, я бы вложил одну переменную char, а затем преобразовал ее (например, c-'0 ') в соответствующее целое число. –

+0

Имейте в виду, что это поместило бы цифру * символ * в массив, а не значение цифры. – dreamlax

+0

@ScottHunter, так как бы преобразовать char в int? – Sean

0

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

int temp = a % 10; 

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

+0

Это число может не вписываться в переменную 'int'. – dreamlax

+0

, так что theres prety та же логика с float или boolean, вы можете настроить, как хотите. –

+0

Это приведет к множеству тонких ошибок для цифровых строк с десятками или более цифр. Поплавки не спасет вас. Нет смысла рассказывать библиотеке, чтобы сделать «int», умножив цифры на 10 и добавив, а затем сразу же отменив все, что работает, за счет модуляции цифры за раз (что также отменяет порядок в лучшем случае). –

1
std::vector<int> numList; 

while(std::cin) { 
    char c; 
    std::cin >> c; 
    if(std::cin.eof()) 
     break; 
    if(c < '0' || c > '9') { 
     // handle error 
    } 
    numList.push_back(c - '0'); 
} 
+0

Я не уверен в C++, но будет ли этот цикл работать слишком много раз? Я думал, что 'cin' только поворачивает наборы failbit или badbit * после *, пытаясь прочитать прошлое EOF. – dreamlax

+0

Извините, что я пытаюсь сказать ... скажем, что в потоке есть только один символ. Первый 'while (cin)' выполняется, потому что поток не сработал и не плох. 'cin >> c' будет читать символ, и поток по-прежнему не работает или не работает, поэтому' while (cin) 'будет зацикливаться снова ... хотя ничего не осталось прочитать. – dreamlax

+0

Хороший улов. Исправлена. –

0

Существует много способов сделать это. Я бы, вероятно, сделал бы что-то вроде следующего:

#include <algorithm> 
#include <fstream> 
#include <iterator> 
#include <vector> 

int ascii2int(int value) // this could be a lambda instead 
{ 
    return value - '0'; 
} 

int main() 
{ 
    std::vector<int> nums; 
    std::ifstream input("euler8Nums.txt"); 
    if (input) 
    { 
     // read character digits into vector<int> 
     nums.assign(std::istream_iterator<char>(input), std::istream_iterator<char>()); 
     // transform ascii '0'..'9' to integer 0..9 
     std::transform(nums.begin(), nums.end(), nums.begin(), ascii2int); 
    } 

    // your code here 

    return 0; 
} 
+0

Для лямбды потребуется C++ 0x/C++ 11 (как бы там ни называлось), правильно? Кроме того, выполняя назначение и преобразование в число, поскольку два отдельных шага требуют двух проходов через память вместо одного. –