C ++ Читать строку из текстового файла и сохранять слово за словом в связанный список - PullRequest
0 голосов
/ 20 января 2019

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

У меня есть текстовый файл:

1-Reserved-2018-12-23-Lecture Room-13
2-Reserved-2018-11-34-Tutorial Room-15
3-Not Reserved-0-0-0-Design Studio-18
4-Reserved-2018-11-16-Lecture Room-14
5-Not Reserved-0-0-0-Exam Hall-18

Я хочу прочитать текстовый файл и сохранить слова в его узлах,(Как ID, data, typeofRoom и т. Д.) Есть ли способ сделать это в C ++?

Это мой класс:

class room {

public:

    int length;
    int initial;

    enum class roomType { main_hall, exam_hall, lecture_room, tutorial_room, design_studio, meeting_room };
    struct node {

        string data;
        int id;
        int capacity;
        int year, month, day;
        int deleteDate;
        roomType type;
        node* next;
    };
    node* front;
    node * tail;
    room() {
        length=0;
        initial=1;

        front = NULL;
        tail = NULL;
    }

    bool isFull () { return length>=20; }


    // Add Rooms
    void room::addRoom() {
        system("cls");

   if (isFull()) {

       cout<<"    No more than 25 rooms are allowed\n"<<endl;
       return;
   }

        cout << "Enter the capacity" << endl;
        int a;
        cin >> a;

        node* temp = new node();
        temp->data = "Not Reserved";
        temp->id = initial;
        temp->year = 0;
        temp->month = 0;
        temp->day = 0;
        temp->deleteDate = 0;

        initial++;
        temp->capacity = a;
        temp->next = NULL;
        if (front == NULL && tail == NULL)
        {
            front = temp;
            tail = temp;
        }
        else {
            tail->next = temp;
            tail = temp;
        }
        cout << "Choose The type" << endl;
        cout << "1- Main Hall \t 2- Lecture Room \t 3- Exam Hall \t 4- Meeting Room \t 5- Design Studio \t 6- Tutorial Room" << endl;
        int t;
        cin >> t;
        if (t == 1)
        {
            temp->type = roomType::main_hall;

        }
        else if (t == 2)
        {
            temp->type = roomType::lecture_room;

        }
        else if (t == 3)
        {
            temp->type = roomType::exam_hall;


        }
        else if (t == 4)
        {
            temp->type = roomType::meeting_room;


        }
        else if (t == 5)
        {
            temp->type = roomType::design_studio;


        }
        else if (t == 6)
        {
            temp->type = roomType::tutorial_room;


        }
        else {cout << "Wrong Input!" << endl;}
        length++;
        cout<<"\n Successfully Created!\n\n";
        system("pause");
        save();
    }
    void reserveRoom()
    {
        system("cls");
        show();
        cout << "=============================================================" << endl;
        cout << "Enter the room ID you want to Book !" << endl;
        int id;
        cin >> id;
        node* tmp = front;

        while (tmp != NULL) {
            if (tmp->id == id) {
                if(tmp->data == "Not Reserved"){
                tmp->data = "Reserved";
                int y,m,d;

                cout << "Enter the year " << endl;
                cin >> y;

                cout << "Enter the month " << endl;
                cin >> m;

                cout << "Enter the day " << endl;
                cin >> d;

                tmp->year = y;
                tmp->month = m;
                tmp->day = d;
                tmp->deleteDate = y+m+d;


                cout << "Room Reserved!" << endl;
                }
                else{
                    cout << "This room has been reserved!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;

                }
            }
            tmp = tmp->next;
        }
        system("pause");
        room::save();

    }
};

1 Ответ

0 голосов
/ 20 января 2019

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

У меня есть текстовый файл:

1-Reserved-2018-12-23-Lecture Room-13
2-Reserved-2018-11-34-Tutorial Room-15
3-Not Reserved-0-0-0-Design Studio-18
4-Reserved-2018-11-16-Lecture Room-14
5-Not Reserved-0-0-0-Exam Hall-18

Продолжая мой комментарий выше, всякий раз, когда вы сталкиваетесь с разделением слов в строке с разделителем между словами, стандартным подходом является каждая строка в string с getline, а затем создайте stringstream из строки, читающей каждое слово в string, используя getline с указанным разделителем.

Зачем читать строку с getline и читать stringstream с getline снова?

Ответ: line-control.

В то время как вы могли бы просто читать непосредственно из вашего файла, используя getline и разделитель, который будет разделять каждое слово, как бы вы узнали, когда заканчивается одна строка, а начинается следующая? Когда вы задаете разделитель для использования с getline, getline будет читать до тех пор, пока не будет найден разделитель или пока не будет прочитан конец ввода или str.max_size символов. См. cppreference.com - std :: getline . Таким образом, в этом случае нет особого значения для окончания строки '\n'.

Однако, если вы прочитаете всю строку в string, а затем создадите stringstream из строки, вы знаете, что можете читать только до конца строки, так как это вызовет конец файла условие на входе. Таким образом, даже если вы используете getline с разделителем, теперь он может читать только до конца строки.

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

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

int main (int argc, char **argv) {

    std::string line;   /* string to hold each line */

    if (argc < 2) {     /* validate at least 1 argument given */
        std::cerr << "error: insufficient input.\n"
                "usage: " << argv[0] << " filename\n";
        return 1;
    }

    std::ifstream f (argv[1]);  /* open file */
    if (!f.is_open()) {         /* validate file open for reading */
        perror (("error opening file " + std::string(argv[1])).c_str());
        return 1;
    }

    while (getline (f, line)) {         /* read each line into line */
        std::string word;               /* string to hold words */
        std::stringstream s (line);     /* create stringstream from line */
        while (getline (s, word, '-'))  /* read hyphen separated words */
            std::cout << word << '\n';  /* output words */
        std::cout << '\n';  /* tidy up with newline between data */
    }
}

Пример входного файла

$ cat ../dat/hyphenstr.txt
1-Reserved-2018-12-23-Lecture Room-13
2-Reserved-2018-11-34-Tutorial Room-15
3-Not Reserved-0-0-0-Design Studio-18
4-Reserved-2018-11-16-Lecture Room-14
5-Not Reserved-0-0-0-Exam Hall-18

Пример использования / Вывод

Обратите внимание, код выше просто выводит дополнительный '\n' между словами, отделенными от каждой строки. Вы должны написать логику (возможно, с использованием счетчика и, например, stoi для любых необходимых преобразований), чтобы преобразовать значения в целочисленные значения и сохранить каждое в соответствующем поле.

$ ./bin/getline_hyphen ../dat/hyphenstr.txt
1
Reserved
2018
12
23
Lecture Room
13

2
Reserved
2018
11
34
Tutorial Room
15

3
Not Reserved
0
0
0
Design Studio
18

4
Reserved
2018
11
16
Lecture Room
14

5
Not Reserved
0
0
0
Exam Hall
18

Вы также можете удалить разделители из каждой строки, создать отдельный stringstream без дефисов и использовать >> для чтения и преобразования значений для каждого узла. (этот второй подход оставлен вам)

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

...