0

I created a simple doubly linked list to store data about the plant. I needed to make the data write and read from a file c++. There were no problems with writing to the file. But I have no idea how to properly read data from a file(. Maybe there are some features.

Earlier, when I wrote data from a file to an array, I sorted through the elements using a loop, by index. but now when I need to write the elements in a double linked list - I really do not understand what to do.

Here is my code:

#include <iostream>
#include <cstring>
#include <list>
#include <fstream>
#include <locale>
#include <cstdlib>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <list>

using namespace std;
typedef struct  
{
    char plant[100];
    char family[100];
    char species[100];  

}BOOK;

typedef struct tag_obj
{
    BOOK b;
    struct tag_obj* prev, * next;
}OBJ;

OBJ* head = NULL, * tail = NULL;

void add_obj(OBJ* obj, BOOK book, char sim[50]) {
    OBJ* c = head;
    while (c != NULL) {
    if (strcmp(c->b.plant, sim) == 0){
         cout<< " element already existst(("<< endl;
        return ;
     }
     c = c->next;
    }
    OBJ* ptr = new OBJ;

    ptr->b = book;
    ptr->prev = obj;
    ptr->next = (obj == NULL) ? NULL : obj->next;

    if (obj != NULL) {
        obj->next = ptr;
        if (obj->next != NULL) obj->next->prev = ptr;
    }
    if (ptr->prev == NULL) head = ptr;
    if (ptr->next == NULL) tail = ptr;
}

void del_obj(OBJ* obj) {
    char x[50];
    cout << "enter the name of the plant whose data you want to delete: ";
    cin >> x;
    OBJ* tmp;
    OBJ* h;

    if (head == NULL) 
    {
        cout << "List empty,nothing to delete" << endl;
        return;
    }
    if (strcmp(head->b.plant, x) == 0)     
    {
        tmp = head;
        head = head->next;  
        head->prev = NULL;   
        cout << "Element Deleted" << endl;
        free(tmp);
        return;
    }
    h = head;
    while (h->next->next != NULL)
    {

        if (strcmp(h->next->b.plant, x) == 0)    
        {
            tmp = h->next;
            h->next = tmp->next;
            tmp->next->prev = h;
            cout << "Element Deleted" << endl;
            free(tmp);
            return;
        }
        h = h->next;
    }
    if (strcmp(h->next->b.plant, x) == 0) 
    {
        tmp = h->next;
        free(tmp);
        h->next = NULL;      
        cout << "Element Deleted" << endl;
        return;
    }
    cout << "Element " << x << " not found" << endl;



}


void show() {
    OBJ* c = head;
    int d = 1;
    while (c != NULL) {
        cout << d << ")" << "  " << c->b.plant << "  " << c->b.family << "  " << c->b.species << endl;
        c = c->next;
        d++;
    }
}


int main() {
    //setlocale(LC_ALL, "ukr");
    ofstream fout;
    fout.open("plant account.txt", ios::app);
    ifstream fin;
    fin.open("plant account.txt");
    if (!fout.is_open())
    {
        cout << "Помилка вiдкриття файлу";
        return 1;
    }
    char sim[50];
    BOOK book = { " PLANT  ","  FAMILY  " };
    //add_obj(tail, book);

    int choice;
    cout << "**plant account**" << endl;
    cout << "1(add an element)" << endl;
    cout << "2(delete)" << endl;
    cout << "3(show)" << endl;
    cout << "4(exit)" << endl << endl;

start:
        cout << " Choose action : ";
        cin >> choice;
        switch (choice)
        {
        case 1:
            fout << endl;
            cout << "Plant name: ";
            cin >> book.plant;
            strcpy_s(sim, book.plant);
            fout << book.plant << "  ";
            cout << "Plant family: ";
            cin >> book.family;
            fout << book.family << "  ";
            cout << "Plant species: ";
            cin >> book.species;
            fout << book.species << "  ";
            add_obj(tail, book,sim);
            cout << endl;

            goto start;
        case 2:
            del_obj(head);
            cout << endl;
            goto start;
        case 3:
            show();
            cout << endl;
            goto start;
        case 4:
            cout << " " << endl;
            exit(222);
        default:
            break;

        }

    fout.close();
    fin.close();

    return 0;
}
Маlnyy
  • 1
  • 1
  • There are many similar questions already answered, see for example [Read file line by line using ifstream in C++](https://stackoverflow.com/questions/7868936/read-file-line-by-line-using-ifstream-in-c) – stefan.gal May 31 '20 at 12:52
  • 1
    I think you should forget about the linked list part and write a practice program that reads and writes to files. Then when you understand how to use files add it to your linked list. – drescherjm May 31 '20 at 12:54
  • `typedef struct` in `c++` you don't need the `typedef`. – drescherjm May 31 '20 at 13:05
  • 1
    As dresherjm said you have two tasks here, reading a BOOK from a file, and adding a BOOK to a list. Solve them separately, one at a time. Breaking down complex tasks into simpler ones is absolutely fundamental to being an effective programmer. One other tip, don't hesitate to change the output format if it makes reading easier. Reading is harder than writing so make any changes needed to the writing to make the reading simpler. – john May 31 '20 at 13:17

0 Answers0