Разделение компактной строки на отдельные целые числа

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

7190007400050083

Следующий фрагмент моего кода считывает одну строку из файла с числами:

std::ifstream file;
file.open("my_file_with_numbers");
std::string line;
file >> line;

Я хочу, чтобы строка была разделена на отдельные значения и сохранена как целые числа в векторе. Перерыл весь интернет, но решения не нашел. Помощь очень ценится.

«Я хочу, чтобы строка была разделена на отдельные значения», как вы разделяете? «Я просмотрел весь Интернет, но не нашел решений» довольно сомнительно, учитывая, что манипуляции со строками довольно фундаментальны.

Passer By 25.03.2024 12:07

Большое спасибо за то, что предоставили мне это блестящее решение, @PasserBy.

Henrik Hillestad Løvold 25.03.2024 12:08
auto value{ std::stoll(line) }; Тогда делайте с value все, что хотите.
Eljay 25.03.2024 12:10

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

Passer By 25.03.2024 12:10

@PasserBy Мне грустно видеть, что мой пост так сильно отвергается. Если бы я мог быть более ясным в будущем, пожалуйста, дайте мне знать, как это сделать. Моя реакция, однако, была на ваш комментарий. Не могли бы вы просто сказать: «Я не понимаю, о чем вы спрашиваете, можете ли вы уточнить»?

Henrik Hillestad Løvold 25.03.2024 12:18

@Eljay Это не разбивает строку на отдельные значения. :)

Vlad from Moscow 25.03.2024 12:18

@VladfromMoscow • В вопросе неясно, сколько цифр содержит значение. Из приведенного ниже ответа видно, что на каждое значение приходится одна цифра.

Eljay 25.03.2024 12:19

Я указал на то, что не понял. Вы не указали, как следует разбивать вещи, и не сказали, что насчет манипуляций со строками, которых вы не понимаете.

Passer By 25.03.2024 12:26

Примечание: выработайте привычку инициализировать объекты значимыми значениями, а не инициализировать их по умолчанию и немедленно перезаписывать значения по умолчанию. В этом составе это означает замену std::ifstream file; file.open("my_file_with_numbers"); на std::ifstream file("my_file_with_numbers");.

Pete Becker 25.03.2024 14:15

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

Pete Becker 25.03.2024 14:17

Сколько цифр в числе?

Thomas Matthews 25.03.2024 16:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
12
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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? :)

Vlad from Moscow 25.03.2024 12:27

Другие вопросы по теме