0

我有这个 iStream 函数可以读取 .txt 数据文件,格式如下:

  Pink Floyd: Dark Side of the Moon
  0:01:30 - Speak to Me

我的功能几乎可以完美运行。

这是我无法弄清楚的问题。1)当每首曲目添加到专辑时打印(输出)(因此打印x第一个专辑的副本,每个专辑都附有下一首曲目。2)创建新专辑时,它保留上一张专辑中的旧曲目,并继续一一添加。(所以最终专辑包含所有专辑中的每首曲目)

显然,我希望每张专辑只打印一次,每张专辑只有自己的歌曲......任何帮助将不胜感激。谢谢。

4

2 回答 2

1

我发现您的代码存在许多问题。

stringstream stringstreamFirst(line);

您没有使用该变量stringstreamFirstline此时为空。

Album anAlbum(artistName,albumTitle,trackVector);

这条线有很多问题。

  • 它使用了错误的值。
    第一行 , artistName,albumTitleTrackVector是空的。当您最终看到一张新专辑时artistNamealbumTitle、 和TrackVector是上一张专辑的专辑,而不是当前专辑。当您访问专辑中的曲目时,这些值是正确的——但这不是您想要创建新专辑对象的时候。
  • 它在错误的地方。
    放置后,此语句为输入文件中的每一行创建一个Album对象。创建新专辑对象的正确位置是在输入文件中遇到新专辑条目时。

stringstream stringstreamNew(line);
stringstream stringstreamNewNew(line);

为什么使用复杂的名称,为什么需要两个变量?另一种方法是使用 but one stringstream,创建为while循环的第一行。

if (!(line[8] == '-'))
else if (line[8] == '-')

不要像这样复制你的布尔条件。如果您的意思是else(这就是您的意思),请使用else. 该行是专辑条目或曲目条目;没有别的了。

else // 缺少这些行

您没有任何错误处理。如果您无法解析什么应该是专辑条目,或者什么应该是曲目条目,该怎么办?

你需要做什么(伪代码):

while (getline(istr, line)) {
   stringstream linestream (line);
   if (line looks like an album line) {
      if (not the first line in the file) {
          // Create an album using the artist name, album title, and track vector
          // and add this album onto the vector of albums
      }
      // Parse the line for artist name and album title, preferably handling errors
      // Clear the trackVector that now pertains to the previous album
   }
   else {
      // Parse the line for track duration and name, preferably handling errors
      // Add the track to the track vector.
   }
}
// Create an album to cover the last album plus set of tracks
于 2012-12-11T13:32:42.233 回答
0

是否Album可能存储对其构造函数参数的引用(甚至指针)?

不要那样做,这意味着只有一个曲目向量 - 称为trackVector- 在专辑之间共享,并且不断添加。

在阅读所有曲目之前,您应该有一个addTrack成员,Album 或者不构建一个成员,Album具体取决于 a 是否Album是可变的。

此外,您从不修改aC- 您希望artistName = artistName完成什么?

于 2012-12-11T13:15:19.997 回答