I have a read function, which reads external files and makes each name a new node, and I’d like to build on the list that I’ve created, but somehow there’s like a gap in the list
example:
I enter in dave, jack, dog, cat.
result:
name: dave
name: jack
name: dog
name: cat
it prints it out, and that’s the list right now. but If I close the program, and run it again, the read function reads back those names and creates the linked list again. But if I choose to add a another name “bob”. It puts it in the next node over
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;
};
is not the way to write a read file loop in C++.
eof()only returns true after an attempt to read past the end of the file, so you execute the body of the loop one time too many.The correct way to write the loop is as follows:
or more idiomatically:
which means exactly the same thing.
Note also that I have used
failed()instead ofeof()– end-of-file is not the only reason reading could fail.