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 を正しく使用していますか? インデックスの 1 つを出力しようとすると、どの変数にも何も含まれていません。前もって感謝します!

4

1 に答える 1

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

おおむね正しいですが、いくつか問題があります。

  • ループの外側にある最初getlineの は、そこにあるべきではありません。それは何を読むべきですか?
  • ループ テストは正確ではありません。最後のレコードが部分的にしか存在しない場合はどうなりますか?
  • >>との混泳には注意が必要ですgetline>>は、最初の行の残りの部分を読み取りません。具体的には、入力ストリームに を残します\nstd::getlineまたはを使用istream::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++ 機能を使用したプログラムの実装の 1 つを次に示します。

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 に答える