C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距



我有一个读取函数,它可以读取外部文件并使每个名称成为新节点,我想在我创建的列表上构建,但不知何故,列表中存在空白

example:
I enter in dave, jack, dog, cat. 
result:
name: dave
name: jack
name: dog
name: cat

它打印出来,这就是现在的列表。 但是如果我关闭程序,然后再次运行它,读取函数会读回这些名称并再次创建链表。但是如果我选择添加另一个名字"鲍勃"。它把它放在下一个节点上

example:
I enter in bob
result:
name: dave
name: jack
name: dog
name: cat
name: [BLANK LINE]
name: bob

6.cpp

#include "6.h"
int main()
{
    petAdoption adopt;
    char response;
    adopt.read();
    do {
    adopt.enroll();
    adopt.display();
    cout << "Another? (y/n): ";
    cin >> response;
    cin.ignore(100,'n');
    } while (toupper(response) == 'Y');
}
petAdoption::petAdoption()
{
head = NULL;
}
void petAdoption::enroll()
{
    char temp[TEMP_SIZE];
    cout << "Name: ";
    cin.getline(temp, TEMP_SIZE);
    pet.name = new char[strlen(temp)+1];
    strcpy(pet.name, temp);
    newNode = new animal;
    newNode->name = pet.name;
    newNode->next = NULL;
    if (NULL == head)
    {
        head = newNode;
        current = newNode;
    }
    else 
    {               
        current = head;
        while (current->next != NULL){
        current = current->next;
        }
        cout << "adding node to the end of the list" << endl;
        current->next = newNode;
        current = current->next;
    }
        ofstream write;
    write.open("pets.txt", ios::app);
        write << current->name << 'n'; 
    write.close();
}
void petAdoption::display()
{
    current = head;
    while (NULL != current)
    {
        cout << "Pet's name: " << current->name << endl;
        current = current->next;
    }
}
void petAdoption::read()
{
    ifstream read;  
    char temp[TEMP_SIZE];
    read.open("pets.txt");
        if(!read)
        {
            cout << "/#S/ There are no pets" << endl;
        }
        else{
            while(!read.eof())
            {
                read.getline(temp, TEMP_SIZE);
                pet.name = new char[strlen(temp)+1];
                strcpy(pet.name, temp);
                newNode = new animal;
                newNode->name = pet.name;
                newNode->next = NULL;
                if (NULL == head)
                {
                    head = newNode;
                    current = newNode;
                }
                else 
                {               
                    current = head;
                    while (current->next != NULL){
                        current = current->next;
                    }
                    current->next = newNode;
                    current = current->next;
                }
            }
        }
    read.close();
}

6.h

#include <iostream>
#include <cctype>
#include <cstring>
#include <fstream>
using namespace std;
const int TEMP_SIZE = 250;
struct animal
{
    char *name;
    animal *next;   
};
class petAdoption
{
    public:
    petAdoption();
    //~petAdoption();
    void enroll();
    void read();
    void display();
    private:
    animal *head, *current, *newNode;
    animal pet;
};
while(!read.eof())
{
    read.getline(temp, TEMP_SIZE);
    ...
}

不是在C++中写入读取文件循环的方法。 eof()仅在尝试读取文件末尾返回 true,因此执行循环正文一次太多。

编写循环的正确方法如下:

for (;;)
{
    read.getline(temp, TEMP_SIZE);
    if (read.failed())
        break;
    ...
}

或更惯用地:

while (read.getline(temp, TEMP_SIZE))
{
    ...
}

意思完全一样。

另请注意,我使用了failed()而不是eof() - 文件结尾不是读取失败的唯一原因。

最新更新