stoi() 函数如何与 C++ 中的 stringstream 一起使用?

How does stoi() function work with stringstream in C++?

所以我是 C++ 的新手,请耐心等待。我正在尝试读取一个 csv 文件并将数据解析为更小的字符串以保存在我的 class 中。当我尝试这样做时,我遇到了 stoi() 的问题。每次我尝试将我的字符串转换为 int 时,我都会收到错误消息“在抛出 'std::invalid_argument' 的实例后终止调用 what(): stoi".

我已经尝试检查我的字符串是否为实际数字,事实确实如此。我检查了是否有 space 或任何其他奇怪的字符,没有。我不确定出了什么问题。指导将不胜感激。

编辑:这是我的代码

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();
}

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)
          }
      }
  }

尽管我会为 MusicData class 编写 operator>> 以便它可以从流中读取自己的数据。

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