Связанный список из текстового файла - PullRequest
1 голос
/ 12 апреля 2011

Я очень плохо знаком с указателями и связанными списками, но я пытаюсь написать простую программу, которая считывает данные из текстового файла в связанный список. У меня проблемы с функцией ввода. Это выглядит так:

DVDNode* CreateList(string fileName)
{
    ifstream inFile;
    inFile.open(fileName.c_str());

    DVDNode* head = NULL;
    DVDNode* dvdPtr;
    dvdPtr = new DVDNode;

    while(inFile && dvdPtr != NULL)
    {
        getline(inFile, dvdPtr -> title);
        getline(inFile, dvdPtr -> leadActor);
        getline(inFile, dvdPtr -> supportingActor);
        getline(inFile, dvdPtr -> genre);
        cin >> dvdPtr -> year;
        cin >> dvdPtr -> rating;
        getline(inFile, dvdPtr -> synopsis);

        dvdPtr -> next = head;
        head = dvdPtr;
        dvdPtr = new DVDNode;
    }

    delete dvdPtr;
    inFile.close();

    return head;
}

У меня также есть функция вывода, которая выглядит следующим образом:

void OutputList(DVDNode* head, string outputFile)
{
    ofstream outFile;
    outFile.open(outputFile.c_str());

    DVDNode* dvdPtr;
    dvdPtr = head;

    while(outFile && dvdPtr != NULL)
    {
        outFile << dvdPtr -> title;
        outFile << dvdPtr -> leadActor;
        outFile << dvdPtr -> supportingActor;
        outFile << dvdPtr -> genre;
        outFile << dvdPtr -> year;
        outFile << dvdPtr -> rating;
        outFile << dvdPtr -> synopsis;

        dvdPtr = dvdPtr -> next;
    }

    outFile.close();

}

Вот как выглядит основной код:

// Variables
string inputFile;
string outputFile;
DVDNode* head;

// Input
cout << "Enter the name of the input file: ";
getline(cin, inputFile);

head = CreateList(inputFile);

// Output
cout << "Enter the name of the output file: ";
getline(cin, outputFile);

OutputList(head, outputFile);

Извините, если это глупый вопрос, я не могу найти в Интернете хороших учебных пособий о связанных списках, и я действительно не понимаю, почему это ничего не делает после того, как я ввожу Имя входного файла.

Заранее спасибо за помощь.

EDIT:
Так что я исправил проблему cin, но теперь есть другая проблема. Когда мой входной файл выглядит так:

Yankee Doodle Dandee
James Cagney
Joan Leslie
Musical
Biography
1942
8
This film depicts the life of the renowned musical composer, playwright, actor, dancer and singer George M. Cohan.

X-Men
Hugh Jackman
Patrick Stewart
Action
Action
2000
7
All over the planet, unusual children are born with an added twist to their genetic code.

Список можно продолжить, в этом формате около 10 фильмов. Однако после запуска программы выходной файл выглядит так:

Title: Yankee Doodle Dandee
Lead Actor: James Cagney
Supporting Actor: Joan Leslie
Genre: Musical
Year: 1735357008
Rating: 544039282
Synopsis: 

Если я добавлю inFile.ignore(100, '\n'); к функции CreateList прямо под строкой, где я читаю в genre, то результат будет выглядеть следующим образом:

Title: This film depicts the life of the renowned musical composer, playwright, actor, dancer and singer George M. Cohan.
Lead Actor: 
Supporting Actor: X-Men
Genre: Hugh Jackman
Year: 0
Rating: 0
Synopsis: 
Title: Yankee Doodle Dandee
Lead Actor: James Cagney
Supporting Actor: Joan Leslie
Genre: Musical
Year: 1942
Rating: 8
Synopsis: 

РЕДАКТИРОВАТЬ: Извините, я понял это. Это было всего лишь вопрос еще нескольких игнорирований. Спасибо.

1 Ответ

6 голосов
/ 12 апреля 2011

Он не висит, он ждет вашего ввода, потому что у вас есть:

cin >> dvdPtr -> year;   // read year from std input!!
cin >> dvdPtr -> rating;

в функции CreateList. Эта функция открывает указанный пользователем файл и считывает с него поля DVD.

Измените вышеуказанные строки на:

inFile >> dvdPtr -> year;   // read year from file.
inFile >> dvdPtr -> rating;
...