Как функция stoi() работает со строковым потоком в C++?

Итак, я новичок в C++, так что терпите меня здесь. Я пытаюсь прочитать CSV-файл и разбить данные на более мелкие строки, чтобы хранить их в моем классе. Пытаясь это сделать, я столкнулся с проблемой stoi(). Каждый раз, когда я пытаюсь преобразовать свою строку в int, я получаю сообщение об ошибке «Завершить вызов после создания экземпляра« std :: invalid_argument » что(): стоит".

Я попытался проверить, является ли моя строка реальным числом, и это так. Я проверил, есть ли пробел или какой-либо другой странный символ, его нет. Я не уверен, что случилось. Руководство будет оценено.

Обновлено: вот мой код

class MusicData 
{
  public:
  void setDate(string theDate) {date = theDate;}
  void setRank(int theRank) {rank = theRank;}
  void setSongName(string theSong) {song = theSong;}
  void setArtist(string theArtist) {artist = theArtist;}
  void setLastWeek(int theLastWeek) {lastWeek = theLastWeek;}
  void setPeakRank(int thePeakRank) {peakRank = thePeakRank;}
  void setTotalWeeks(int total) {weeksOnBoard = total;}
  string getDate()  {return date;}
  int getRank() {return rank;}
  string getSong() {return song;}
  string getArtist() {return artist;}
  int getLastWeek() {return lastWeek;}
  int getPeakRank() {return peakRank;}
  int getTotalWeeks() {return weeksOnBoard;}

 private:
 int rank, lastWeek, peakRank, weeksOnBoard;
 string date, song, artist;
};


void readFromFile( const char fileName[], vector <string>& hold )   
{
  MusicData aSong;
  ifstream file;
  file.open(fileName);    
       
  assert(file.fail() == false);    
  string data;
  string date, str_ranks, songName, artist, str_last_week;
  int ranks, lastWeek;
  while (getline(file, data))
  {
    stringstream s(data);

    getline(s, date, ',');
    aSong.setDate(date);

    getline(s, str_ranks, ',');
    ranks = stoi(str_ranks);
  }

  file.close();
}

Добавить сюда свой код?

InQusitive 23.03.2022 07:19

Пожалуйста, создайте минимальный воспроизводимый пример. С предоставленной информацией, это просто предположение о проблеме.

chris 23.03.2022 07:20
cplusplus.com/reference/string/stoi
balu 23.03.2022 07:23

С stringstream вы можете использовать >> и полностью избегать stoi.

user4581301 23.03.2022 07:31

Я пробовал это. По какой-то причине он не печатает правильное название песни после того, как я использую stringstream. Я действительно сбит с толку, так как впервые использую stringstream. Я использовал stoi(), но я не уверен, почему это не работает.

maria guallpa 23.03.2022 07:45
stoi генерирует исключение этого типа, если предоставленная строка не может быть преобразована, вы должны обработать это с помощью блока try\catch. И для этого требуется отладочная информация (входные и выходные примеры), чтобы понять, почему вы получаете неправильный ввод.
Swift - Friday Pie 23.03.2022 08:11

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

Alan Birtles 23.03.2022 08:34
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

operator>> будет считывать поток напрямую в целое число (вам не нужно преобразовывать его вручную).

  string data;
  int rank;
  while (getline(file, data))
  {
      stringstream s(data);

      // Always check stream operations worked.
      if (getline(s, date, ',')) {
          aSong.setDate(date);     // Why is Date a string.
                                   // Should this not be its own type?

          char sep = 'X';
          if (s >> rank >> sep && sep == ',') {
              aSong.setRank(rank)
          }
      }
  }

Хотя я бы написал operator>> для класса MusicData, чтобы он мог читать свои данные из потока.

  class MusicData
  {
        // STUFF
        friend std::istream& operator>>(std::istream& str, MusicData& value);
  };

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