文件I / O代码无法正确读取C ++

时间:2012-07-02 19:51:29

标签: c++ file-io getline

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吗? 如果我尝试输出其中一个索引,它在任何变量中都没有任何内容。提前谢谢!

1 个答案:

答案 0 :(得分:4)

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

这大多是正确的,但有一些问题:

  • 第一个getline,即循环之外的那个,不应该在那里。应该读什么?
  • 循环测试不完全正确 - 如果最后一条记录只是部分存在会发生什么?
  • >>getline混合时必须小心。 >>未读取第一行的其余部分 - 具体而言,它会在输入流中保留\n。使用std::getlineistream::ignore删除待处理的行尾。
  • 如果家庭作业允许,您最好使用std::vector而不是数组。

尝试:

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