В C++, как я могу создать файл чисел, не отнесенных к массиву?C++ cin из файла с неустановленными номерами
Например, 78940725450327458, как можно разместить эти числа, чтобы список [0] = 7, список [1] = 8, список [2] = 9 и т. Д.
В C++, как я могу создать файл чисел, не отнесенных к массиву?C++ cin из файла с неустановленными номерами
Например, 78940725450327458, как можно разместить эти числа, чтобы список [0] = 7, список [1] = 8, список [2] = 9 и т. Д.
Составьте список из массива char
s.
cin >> list[0]
будет читать один символ.
За исключением того, что похоже, что Шон хочет числовые значения; если это так, я бы вложил одну переменную char, а затем преобразовал ее (например, c-'0 ') в соответствующее целое число. –
Имейте в виду, что это поместило бы цифру * символ * в массив, а не значение цифры. – dreamlax
@ScottHunter, так как бы преобразовать char в int? – Sean
Я хотел бы предложить вам прочитать все строки в INT переменную, а затем сделать петлю с чем-то вроде этого:
int temp = a % 10;
это даст вам последний номер каждый раз, не забудьте обновить исходное число после этого и последнее, что нужно сделать, это поместить его в массив, так что это простая часть.
Это число может не вписываться в переменную 'int'. – dreamlax
, так что theres prety та же логика с float или boolean, вы можете настроить, как хотите. –
Это приведет к множеству тонких ошибок для цифровых строк с десятками или более цифр. Поплавки не спасет вас. Нет смысла рассказывать библиотеке, чтобы сделать «int», умножив цифры на 10 и добавив, а затем сразу же отменив все, что работает, за счет модуляции цифры за раз (что также отменяет порядок в лучшем случае). –
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');
}
Я не уверен в C++, но будет ли этот цикл работать слишком много раз? Я думал, что 'cin' только поворачивает наборы failbit или badbit * после *, пытаясь прочитать прошлое EOF. – dreamlax
Извините, что я пытаюсь сказать ... скажем, что в потоке есть только один символ. Первый 'while (cin)' выполняется, потому что поток не сработал и не плох. 'cin >> c' будет читать символ, и поток по-прежнему не работает или не работает, поэтому' while (cin) 'будет зацикливаться снова ... хотя ничего не осталось прочитать. – dreamlax
Хороший улов. Исправлена. –
Существует много способов сделать это. Я бы, вероятно, сделал бы что-то вроде следующего:
#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;
}
Для лямбды потребуется C++ 0x/C++ 11 (как бы там ни называлось), правильно? Кроме того, выполняя назначение и преобразование в число, поскольку два отдельных шага требуют двух проходов через память вместо одного. –
Это домашнее задание? – dasblinkenlight
Нет его для проекта euler – Sean