1
void createVideoList(ifstream& ifile, Video videoArray[])
{
string title;
string star1;
string star2;
string producer;
string director;
string productionCo;
int inStock;
int count = 0;
Video newVideo;
getline(ifile, title);
while (ifile)
{
    ifile >> inStock;
    getline(ifile, title);
    getline(ifile, star1);
    getline(ifile, star2);
    getline(ifile, producer);
    getline(ifile, director);
    getline(ifile, productionCo);
    videoArray[count] = Video(inStock, title, star1, star2, producer, director, productionCo);
    count++;
}
}

这是我的编程作业代码。它将从 .txt 文件中读取,并将信息放入我创建的类的数组中。

.txt 的格式如下:

3 (amount in stock)
Movie Title
Movie Star1
Movie Star2
Movie Producer
Movie Director
Movie ProductionCo

但是,我的代码似乎没有将数据正确地收集到 videoArray 中。我刚从 Java 切换过来,所以我的 C++ 语法有点生疏。我正确使用 getline 吗?如果我尝试输出其中一个索引,则它在任何变量中都没有。提前致谢!

4

1 回答 1

4
Video newVideo;
getline(ifile, title);
while (ifile)
{
    ifile >> inStock;
    getline(ifile, title);
    getline(ifile, star1);
    ...

大部分是正确的,但有几个问题:

  • 第一个getline,循环之外的那个,不应该在那里。它应该读什么?
  • 循环测试并不完全正确——如果最后一条记录仅部分存在会发生什么?
  • >>与.混合时必须小心getline。The>>不会读取第一行的其余部分——具体来说,它会将 the\n留在输入流中。使用std::getlineistream::ignore删除挂起的行尾。
  • std::vector如果家庭作业允许,最好使用 a而不是数组。

尝试:

while (ifile >> inStock && getline(ifile, temporary_string) &&
       getline(ifile, title) &&
       getline(ifile, star1) &&
       ...
       getline(ifile, productionCo) )
{
  videoVector.push_back(Video(inStock, title, ..., productionCo_));

  // Or, as a less worthy alternative, 
  //  videoArray[count] = Video(inStock, title, star1, star2, producer, director, productionCo);
  //  count++;
}


作为您将在未来几周内学习的语言功能的演示,这里是您的程序的一个使用现代 C++ 功能的实现:

std::istream&
operator>>(std::istream& is, Video& v)
{
  is >> v.inStock;
  is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  std::getline(is, v.title);
  std::getline(is, v.star1);
  std::getline(is, v.star2);
  std::getline(is, v.producer);
  std::getline(is, v.director);
  std::getline(is, v.productionCo);
  return is;
}
std::vector<Video> void createVideoList(std::istream& ifile)
{
  std::vector<Video> result;
  std::istream_iterator<Video> begin(ifile), end;
  std::copy(begin, end, std::back_inserter(result));
  return result;
}
于 2012-07-02T19:59:11.547 回答