C++ iStream, If-Else & Vectors

C++ iStream, If-Else & Vectors

本文关键字:Vectors If-Else iStream C++      更新时间:2023-10-16

我有这个iStream函数来读取.txt文件中的数据,格式为:

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

我的功能几乎完美。

以下是我无法解决的问题。1) 当每个曲目都添加到专辑中时,它会打印(输出)第一个专辑的x副本,每个副本都附带下一个曲目。2) 创建新专辑时,会保留上一张专辑中的旧曲目,并继续逐个添加。(所以最后一张专辑有所有专辑中的每一首曲目)

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

我发现您的代码有很多问题。

stringstream stringstreamFirst(line);

您没有使用变量stringstreamFirst,此时line为空。

Album anAlbum(artistName,albumTitle,trackVector);

这行有很多问题。

  • 它使用了错误的值
    在第一行中,artistNamealbumTitleTrackVector为空。当你最终看到一张新专辑时,artistNamealbumTitleTrackVector是上一张专辑的,而不是当前专辑的。当你进入专辑中的曲目时,这些值是正确的,但当你想创建一个新的专辑对象时,这些数值就不正确了
  • 它放错地方了
    如上所述,此语句为输入文件中的每一行创建一个Album对象。当您在输入文件中遇到新相册条目时,才是创建新相册对象的正确位置

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

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

if(!(第[8]=='-'行))
else if(第[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

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

不要这样做,这意味着专辑之间只有一个名为trackVector的曲目矢量共享,并不断添加到中

您应该在Album中有一个addTrack成员,或者在读取所有轨道之前不构造Album,这取决于Album可变是否合理。

此外,您从未修改过aC-您希望artistName = artistName实现什么?