2016-10-04 8 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; 

Где Дата - класс, включающий ints для дня, месяца и года. Это не создает жизнеспособной ошибки overloaded =.Эквивалент Getline для класса и 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 опубликовал (Дата класс), цена (INT), страница (целое), а также копии (интермедиат) Я получаю вызов на нет соответствия функции для GetLine. Я знаю, что getline для строк, поэтому я ожидал этой ошибки. Что я могу сделать вместо этого?

Спасибо, и если вам нужно увидеть больше кода, дайте мне знать.

+0

'cin >> price;' etc? Обычно люди узнают о '>>' перед 'getline'. – immibis

+0

Не так тривиально на этом @immibis. шансы слишком хороши, что некоторые из этих переменных будут многословными. – user4581301

+0

Пожалуйста, отправьте сообщение [mcve]. –

ответ

0

Нельзя просто std::getline в int. Шутки в сторону. Это тяжелее, чем ходить в Мордор.

Несколько способов сделать это.

Один из них заключается в смешении std::getline и использовании оператора >>. Но

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

не будет работать, потому что myFile >> price; оставляет конец строки в потоке, чтобы быть проглочены getline(myFile,isbn), в результате пустой строки в 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); 

безопаснее. Он отбрасывает все, вплоть до конца строки.

К сожалению, вы не можете сделать это с помощью published, если вы не написали operator>> для Date.

Следующая хорошая опция - читать во всем как строку, а затем преобразовывать ее в соответствующий тип данных перед вызовом конструктора 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; 
} 

Off тему: Обратите внимание, как все getline с находятся в while этого не будет входить в тело цикла, если чтение всех входов не удалось.

while(myFile) 

проверяет доброту в начале до того, как все значения будут считаны. Все это говорит вам, что последнее, что вы читаете, было хорошим. Это не дает никаких гарантий относительно качества следующих вещей, которые вы будете читать. В настоящее время getline(myFile,title); может потерпеть неудачу вместе со всем после него, и вы создадите новый Book с результатами недействительных чтений. Всегда читайте, проверяйте, что вы читаете хорошую информацию, и только затем используйте то, что вы читаете.

Возможно, лучший способ - взять любой из двух вышеуказанных методов и построить их в operator>> для Book.

Тогда вы можете

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

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

    return 0; 
} 

Это даже позволяет легко избавиться от dynmaically выделяется Book, и что стоит на вес золота.

+0

User4581301, вышеупомянутый отзыв отлично подходит для цены, страницы и копий, но не будет работать для опубликованных (дата). Любые другие опции для string_to_date (опубликованы), // функция не существует? Я должен использовать опубликованный как класс Date для этого назначения. Извините за ошибки форматирования, впервые используя этот сайт. –

+0

@WilliamStoneOtworth я полностью игнорировал 'Date', потому что я понятия не имею, как он выглядит, как он хранит информацию или какую информацию он хранит, кроме даты. Это может быть так же просто, как 'Date string_to_date (string datestr) {return Date (datestr)}'. Даже если вы не можете изменить дату, иногда вы можете написать '>>' для нее в стороне. Подробнее здесь: http://stackoverflow.com/questions/4421706/operator-overloading (добавьте эту ссылку, кстати, это настоящая бекон) – user4581301

 Смежные вопросы

  • Нет связанных вопросов^_^