Помогите прочитать каждые пять строк из текстового файла C ++ - PullRequest
0 голосов
/ 12 октября 2010

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

    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;

        }

    }

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

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

Вам необходимо использовать функцию 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 голосов
/ 12 октября 2010

Меня слегка смущает использование 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 голосов
/ 12 октября 2010

Это то, что у меня сейчас, файл до сих пор не читается. Я не знаю, что делать.

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;

            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...