Я пытаюсь написать программу, которая читает файл построчно и сохраняет содержимое каждой строки в виде отдельных целочисленных значений. Типичная строка может выглядеть так:
7190007400050083
Следующий фрагмент моего кода считывает одну строку из файла с числами:
std::ifstream file;
file.open("my_file_with_numbers");
std::string line;
file >> line;
Я хочу, чтобы строка была разделена на отдельные значения и сохранена как целые числа в векторе. Перерыл весь интернет, но решения не нашел. Помощь очень ценится.
Большое спасибо за то, что предоставили мне это блестящее решение, @PasserBy.
auto value{ std::stoll(line) };
Тогда делайте с value
все, что хотите.
Вы можете оставить саркастические комментарии и ничего не добиться, или вы можете отредактировать свой вопрос с необходимыми требованиями и рассказать нам, на каком концептуальном блокпосте вы застряли после прочтения о манипуляциях со строками.
@PasserBy Мне грустно видеть, что мой пост так сильно отвергается. Если бы я мог быть более ясным в будущем, пожалуйста, дайте мне знать, как это сделать. Моя реакция, однако, была на ваш комментарий. Не могли бы вы просто сказать: «Я не понимаю, о чем вы спрашиваете, можете ли вы уточнить»?
@Eljay Это не разбивает строку на отдельные значения. :)
@VladfromMoscow • В вопросе неясно, сколько цифр содержит значение. Из приведенного ниже ответа видно, что на каждое значение приходится одна цифра.
Я указал на то, что не понял. Вы не указали, как следует разбивать вещи, и не сказали, что насчет манипуляций со строками, которых вы не понимаете.
Примечание: выработайте привычку инициализировать объекты значимыми значениями, а не инициализировать их по умолчанию и немедленно перезаписывать значения по умолчанию. В этом составе это означает замену std::ifstream file; file.open("my_file_with_numbers");
на std::ifstream file("my_file_with_numbers");
.
Вас продолжают отрицать, потому что в вопросе четко не указано, каково правило преобразования этой строки в числа, и вы не отредактировали ее, чтобы прояснить ее.
Сколько цифр в числе?
Предполагая, что вам нужно одно значение для каждой цифры, вы можете сделать, например.
std::vector<int> vec(line.length());
std::transform(begin(line), end(line), begin(vec),
[](char const& ch)
{
return ch - '0';
});
В качестве входной строки "7190007400050083"
вы получите вектор { 7, 1, 9, 0, 0, 0, 7, 4, 0, 0, 0, 5, 0, 0, 8, 3 }
.
В противном случае, насколько большими могут быть числа? Могут ли они быть отрицательными? Почему бы для начала не прочитать его непосредственно в целых числах, зачем использовать строку?
Для этого и снова с предположением, что все значения будут соответствовать 64-битному целочисленному типу без знака:
std::vector<unsigned long long> vec;
unsigned long long value;
while (file >> value)
{
vec.push_back(value);
}
Вышеупомянутое решение является наивным и начинающим, но есть и другие способы:
std::vector<unsigned long long> vec(
std::istream_iterator<unsigned long long>(file),
std::istream_iterator<unsigned long long>());
Для целочисленных значений произвольной длины вам понадобится библиотека «bignum», например GMP.
@Какой-то программист, чувак А как определена последняя функция vec? :)
«Я хочу, чтобы строка была разделена на отдельные значения», как вы разделяете? «Я просмотрел весь Интернет, но не нашел решений» довольно сомнительно, учитывая, что манипуляции со строками довольно фундаментальны.