0

コードは次のとおりです。

// pointers to structures
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct movies_t {
  string title;
  int year;
};

int main ()
{
  string mystr;

  movies_t amovie;
  movies_t * pmovie;
  pmovie = &amovie;

  cout << "Enter title: ";
  getline (cin, pmovie->title);
  cout << "Enter year: ";
  getline (cin, mystr);
  (stringstream) mystr >> pmovie->year;

  cout << "\nYou have entered:\n";
  cout << pmovie->title;
  cout << " (" << pmovie->year << ")\n";

  return 0;
}

http://www.cplusplus.com/doc/tutorial/structures/から取得。私はいくつかのことについて説明が得られることを望んでいました。

  1. それは何でgetline、どのように機能しますか?ドキュメントを調べてみましたが、まだ理解できません。また、正確には何でcinあり、どのように使用されていgetlineますか?

  2. 私が正しく理解していれば、本質的にそれはオブジェクトのメンバーを指してpmovie->titleいると言いますか?もしそうなら、そしてそれは#1の説明からまだ明らかではありませんが、どのように機能しますか?pmovietitleamoviegetline (cin, pmovie->title)

  3. 今、これ(stringstream) mystr >> pmovie->yearは私に最も問題を与えています。とは何stringstreamですか。たとえば、doubleをintとしてキャストするように使用していますか?

皆さん、ありがとうございました!

4

3 に答える 3

2

getlineとは何ですか?どのように機能しますか?ドキュメントを調べてみましたが、まだ理解できません。また、cinとは正確には何であり、getlineでどのように使用されていますか?

このgetline関数は、から行を読み取りますistream。ストリームは、通常入力を取得する標準のcin入力ストリームを指します。getlineどの入力ストリームから行を取得するかを指示するために渡されます。

私が正しく理解していれば、pmovie-> titleは基本的に、pmovieがオブジェクトamovieのメンバータイトルを指していることを示していますか?もしそうなら、そして#1の説明からまだ明らかではありませんが、getline(cin、pmovie-> title)はどのように機能しますか?

getline関数はから行を読み取り、参照によって渡される行を格納しますcinpmovie->title

今、この(stringstream)mystr >>pmovie->yearは私に最も問題を与えています。文字列ストリームとは何ですか。たとえば、doubleをintとしてキャストするように使用していますか?

Astringstreamは、文字列をストリームのように機能させるクラスです。これは一種の紛らわしい構文(Cスタイルのキャスト)であり、何が起こっているのかを理解するのが少し難しくなります。基本的に、一時的なstringstreamものは、の内容で作成および初期化されますmystr。は、文字列で初期化されるstringstreamと、それらのコンテンツを読み取ることができるストリームを提供します。演算子は>>、この場合は出力ストリームからに読み取り、pmovie->yearこれも参照によって渡されます。

ちなみに、これらのオブジェクトのより基本的な使用法をまだ理解せずに、非常に複雑で紛らわしい使用法を理解しようとしているように私には思えます。それは学ぶのが非常に難しい方法です。

于 2012-08-19T23:45:16.910 に答える
1

ほとんどの質問は、構造に関するものではないようです。したがって、ストリームに関する問題ではなく、タイトルに関連する問題に対処しています。

私の理解が正しければ、pmovie->title は基本的に、pmovie がオブジェクト amovie のメンバー タイトルを指していると言っていますか? もしそうなら、そして#1の説明からまだ明らかではありませんが、getline(cin、pmovie-> title)はどのように機能しますか?

勘違いしている。これがあなたの混乱の根源であると思います:オブジェクトpmovieを指していmovies_tます。movies_tたまたま、サンプル コードでは、という名前のオブジェクトを指すように初期化されていますamovie

現在、各movies_tオブジェクトには 2 つのメンバー、つまりサブオブジェクト atitleと a がありyearます。ポインタが指すtitleコンポーネントにアクセスするには、 を使用します。コンポーネントにアクセスするには、代わりに を使用します。movies_tpmovie->titleyearpmovie->year

ただし、ストリームについて私が言うことは次のとおりです。読み取りが成功したと想定する前に、入力が成功したことを常に確認する必要があります。たとえば、次を使用して、行の読み取りが成功したことを確認します。

if (std::getline(std::cin, pmovie->title)) {
    // deal with a successfully read title
}
于 2012-08-19T23:55:42.897 に答える
0
  1. cin標準出力 (通常はキーボードですが、ほとんど何でもかまいません) で動作するように C++ によって定義された特別なストリームです。getlineプラットフォームの行末 (UNIX ではライン フィード、Windows および DOS ではキャリッジ リターン ライン フィード) に到達するまで、ストリームからバッファにテキストを読み取ることができる関数です。
  2. pmovie->titlepmove、 というメンバーを持つ構造体へのポインターであると言いtitleます。これはそのメンバーを指します。getlinestring&(String 参照) を受け取るため、 によって参照される文字列を問題なく受け入れますpmovie->title
  3. stringstreamstrings をs に変換する暗黙のコンストラクターを定義しstringstreamます。>>演算子は文字列から入力を取得し、それをターゲットの型 ( の右側にあるオペランドの型) に変換して>>そこに置きます。これは、文字列を整数に変換する方法にすぎません。
于 2012-08-19T23:50:13.303 に答える