2010-10-12 5 views
0

В качестве части большего назначения мне нужно создать метод в классе, который может читать пять строк данных, а затем помещать эти данные в динамически созданный объект. Я не уверен, как идти о получении пяти строк данных отдельно в объект. Код должен помочь лучше объяснить, но он не работает по желанию. Если кто-то может определить мои ошибки, пожалуйста, дайте мне знать. Если вы можете мне помочь, мы будем очень благодарны. Также каждые пять строк читаются, я создаю новый объект, пока строки не останутся. Как я узнаю, останутся ли какие-либо строки? Еще раз спасибо за помощь, спасибо за ваше время.Помочь чтению каждые пять строк из текстового файла C++

inline void readFromFile(const string& fileName){ 

     string title; 
     string category; 
     unsigned int runningTime; 
     unsigned int yearOfRelease; 
     double price; 

     ifstream myReadFile; 
     myReadFile.open(fileName); 

     while(myReadFile) 
     { 
      myReadFile>>title; 
      myReadFile >> category; 
      myReadFile >> runningTime; 
      myReadFile >> yearOfRelease; 
      myReadFile >> price; 

      v.push_back(new DVD(title,category,runningTime,yearOfRelease,price)); 
     } 

     myReadFile.close(); 

     for(unsigned int i = 0; i < v.size(); i++){ 

      cout << *v.at(i) << endl; 

     } 

    } 

ответ

2

Проблема заключается в том, что оператор >> со строкой читает только одно слово (а не строку).

Вам необходимо использовать функцию std :: getline().

 std::getline(myReadFile, title); 
     std::getline(myReadFile, category); 
     std::getline(myReadFile, runningTime); 
     std::getline(myReadFile, yearOfRelease); 
     std::getline(myReadFile, price); 

Для удобства вы должны написать оператор >> для DVD

std::istream& operator>>(std::istream& str, DVD& data) 
{ 
    // Read data into data here 
    return str; 
} 

Теперь ваш цикл становится намного проще:

std::copy(std::istream_iterator<DVD>(myReadFile), 
      std::istream_iterator<DVD>(), 
      std::back_inserter(v) 
     ); 
+0

Это то, что у меня есть до сих пор. Это правда, что это может быть проще, но мой опыт работы с C++ очень ограничен, поэтому я стараюсь держать его как можно более простым. Я сделал первые несколько изменений, но теперь файл не читается, и данные не отображаются. Извините меня за недостаток знаний в C++, но я стараюсь учиться. Какие изменения я предлагаю сделать в коде. – Delanoy

+0

@ Delanoy: Как предложил Мартин, вы должны использовать 'getline' вместо' >> 'для строк (' title' и 'category' в вашем случае). Остальные поля - это числовые значения, и вы можете продолжать использовать '>>' для них. – casablanca

+0

@casablanca: @ Даланой: Обычно я соглашаюсь с casablanca и предлагаю использовать оператора >>. Но в формате файла четко указано, что запись длится пять строк. Поэтому вы должны попытаться гарантировать, что вы прочтете ровно пять строк. Если вы используете оператор >>, конечные пробелы могут быть оставлены на последней строке. Это может быть проблемой при чтении следующего объекта. Таким образом, я бы прочитал пять строк в объектах. Затем я бы преобразовал каждую строку в соответствующий тип (возможно, с boost :: lexical_cast <> или вторым выбором std :: stringstream) –

0

Это то, что я сейчас, то файл все еще не читается. Я теряюсь, что делать.

inline void readFromFile(const string& fileName){ 

      string title; 
      string category; 
      unsigned int runningTime; 
      unsigned int yearOfRelease; 
      double price; 

      ifstream myReadFile; 
      myReadFile.open(fileName); 

      while(! myReadFile.eof()) 
      { 
       getline(myReadFile, title); 
       getline(myReadFile, category); 
       myReadFile >> runningTime; 
       myReadFile >> yearOfRelease; 
       myReadFile >> price; 

       v.push_back(new DVD(title,category,runningTime,yearOfRelease,price)); 
      } 

      myReadFile.close(); 

      for(unsigned int i = 0; i < v.size(); i++){ 

       cout << *v.at(i) << endl; 

      } 

     } 
0

Я немного смущен вашим использованием getline(). Попробуйте получить данные, вызвав getline() в переменной myReadFile. Это использует массив символов. Таким образом, один из возможных способов перезаписи кода может быть таким, как указано ниже:

PS: Обратите внимание, что ваше имя файла правильно ограничивает косые черты (\) при создании строки.

void readFromFile(const string& fileName){ 
      char title[80]; 
      char category[80]; 
      unsigned int runningTime; 
      unsigned int yearOfRelease; 
      double price; 

      ifstream myReadFile; 
      myReadFile.open(fileName.c_str()); 

      while(! myReadFile.eof()) 
      { 
       myReadFile.getline(title, 80); 
       myReadFile.getline(category, 80); 
       myReadFile >> runningTime; 
       myReadFile >> yearOfRelease; 
       myReadFile >> price; 

       v.push_back(new DVD(title,category,runningTime,yearOfRelease,price)); 
      } 

      myReadFile.close(); 

      for(unsigned int i = 0; i < v.size(); i++){ 

       cout << *v.at(i) << endl; 

      } 

     } 
+0

Существует строка getline(), которая использует строки, поэтому вам не нужно указывать ограничение по размеру линии. Также, что происходит, если на последней строке после цены есть конечные пробелы? –

+0

Хорошие очки. Я раньше не обнаружил std :: getline (istrm, string &). Цикл while также не требуется, так как файл должен иметь только 5 строк. – Jughead

+0

Я получил его на работу, спасибо всем за помощь! – Delanoy

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