2016-10-04 9 views
-2
class Book{ 
public: 
string _title; 
string _author; 
string _publisher; 
Date _published; 
float _price; 
string _isbn; 
int _page; 
int _copies; 


Book(void); 
Book(string, string, string, Date, float, string, int, int); 
}; 

Book::Book(void) 
{ 
_title = ""; 
_author = ""; 
_publisher = ""; 
_published = 0; 
_price = 0; 
_isbn = ""; 
_page = 0; 
_copies = 0; 

ここで、Dateは日、月、および年のintを含むクラスです。これにより、実行可能な過負荷=エラーは発生しません。クラスとintのゲットラインの同等であり、 '実行可能なオーバーロードされた='エラーもありません。

int main(void) 
{ 
LinkedList myList; 
ifstream myFile("sample.txt"); 

string title; 
string author; 
string publisher; 
Date published; 
float price; 
string isbn; 
int page; 
int copies; 


while(myFile) 
{ 
getline(myFile,title); 
getline(myFile,author); 
getline(myFile,publisher); 
getline(myFile,published); 
getline(myFile,price); 
getline(myFile,isbn); 
getline(myFile,page); 
getline(myFile,copies); 

myList.insert_rear(new Book(title,author,publisher,published,price,isbn,page,copies)); 
} 

myList.print_list(); 

return 0; 

}

getlineの公表(Dateクラス)、価格(int型)、ページ(int型)、およびコピー(int型)のために、私はgetl​​ineのに該当する関数呼び出しを取得しています。 getlineは文字列のため、私はそのエラーを予想していました。代わりに私は何をすることができますか?

ありがとうございました。さらにコードを表示する必要がある場合は、お知らせください。

+0

'cin >> price;' etc?通常、人々はgetl​​ineの前に '' ''について学びます。 – immibis

+0

@immibisはこれほど些細なことではありません。オッズはあまりにも良いので、それらの変数のいくつかはマルチワードになるでしょう。 – user4581301

+0

[mcve]を投稿してください。 –

答えて

0

std::getlineintに簡単にまとめることはできません。真剣に。モルドールに入るよりも難しいです。

これを行うにはいくつかの方法があります。

std::getline>>演算子を混在させる方法があります。 myFile >> price;isbnに空の文字列に結果getline(myFile,isbn)によってアップ丸飲みするストリームの行末を離れるので、しかし

myFile >> price; 
getline(myFile,isbn); 

は動作しません。単純に何かのように

char end_of_line; 
myFile >> price >> end_of_line; 
getline(myFile,isbn); 

あなたのファイルが厳密に形式を遵守していると仮定して、仕事をします。

myFile >> price; 
myFile.ignore(numeric_limits<streamsize>::max(), '\n'); 
getline(myFile,isbn); 

がより安全です。これは、行末までのすべてを破棄します。

Dateoperator>>と書いていない限り、悲しいことに、publishedでこれを行うことはできません。

次の良いオプションは、すべてを文字列として読み込んだ後、Bookコンストラクタを呼び出す前に、適切なデータ型に変換することです。オフトピック

int main() 
{ 
    ifstream myFile("sample.txt"); 

    string title; 
    string author; 
    string publisher; 
    string published; 
    string price; 
    string isbn; 
    string page; 
    string copies; 

    while (getline(myFile, title) && 
      getline(myFile, author) && 
      getline(myFile, publisher) && 
      getline(myFile, published) && 
      getline(myFile, price) && 
      getline(myFile, isbn) && 
      getline(myFile, page) && 
      getline(myFile, copies)) 
    { 
     myList.insert_rear(new Book(title, 
            author, 
            publisher, 
            string_to_date(published), // function does not exist 
            stof(price), 
            isbn, 
            stoi(page), 
            stoi(copies))); 
    } 

    return 0; 
} 

の線に沿って何か:getline Sの全てが、入力のすべての読み取りが成功しない限り、これはループの本体に入りませんwhileであるかに注意してください。

while(myFile) 

すべての値が読み取られる前に、最初の良さをテストします。すべてこれはあなたが読んだ最後のものが良かったと伝えます。それはあなたが読む次のものの質について保証するものではありません。現在、getline(myFile,title);はそれ以降のすべてで失敗する可能性があり、無効な読み取りの結果で新しいBookをビルドします。常に読んで、あなたが良い情報を読んでいることをテストして、それからあなたが読んだものを使用してください。

おそらく最も良い方法は、上記の2つの方法のいずれかを使用してBookoperator>>にすることです。

次にあなたがすることができます

int main() 
{ 
    ifstream myFile("sample.txt"); 

    Book temp; 
    while (myFile >> temp) 
    { 
     myList.insert_rear(new Book(temp)); 
    } 

    return 0; 
} 

これはさえBookを割り当てられ、それはそれは金で重さだ価値があるdynmaicallyを取り除くすることが容易になります。

+0

User4581301、前述のヒントは価格、ページ、コピーには効果的ですが、公開(日付)では機能しません。 string_to_date(published)、// functionの他のオプションは存在しません。私は、この課題のためのクラスDateとして公開を使用する必要があります。このサイトを初めて使用したときにフォーマットエラーが発生しました。 –

+0

@WilliamStoneOtworth私はそれがどのように見えるか、どのように情報を保存するか、日付以外にどのような情報を保存しているか分からないので、「日付」を完全に無視しました。これは、 'Date string_to_date(string datestr){return Date(datestr)}'のように単純なものです。 Dateを変更できない場合でも、時にはそのために '>'を書くことができます。その他の情報:http://stackoverflow.com/questions/4421706/operator-overloading(途中でリンクをブックマークしてください。実際のベーコンセーバーです) – user4581301

関連する問題