Как заставить цикл for перейти в конец массива char * и поместить каждый город в связанный список (города разделены пробелами) - PullRequest
0 голосов
/ 12 мая 2019

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

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

#include <iostream>
#include <fstream>
using namespace std;

class List
{
    struct Node
    {
        char* input;
        Node* next;
    };
    Node* head;
    Node* tail;

public:
    List()
    {
        head = NULL;
        tail = NULL;
    }
    void createnode(char* city)
    {
        Node* temp = new Node;
        temp->input= city;
        temp->next = NULL;
        if (head == NULL)
        {
            head = temp;
            tail = temp;
        }
        else
        {
            Node* point = new Node;
            point->input= city;
            point->next = head;
            head = point;
        }
    }

    void display()
    {
        Node* point = head;
        if (point == NULL)
        {
            cout << endl << "====================================" << endl << "List Doesnt exist/is deleted" << endl << "====================================" << endl;
            return;
        }
        cout << endl << "your list:" << endl;
        while (point != NULL)
        {
            cout << point->input<< "\t";
            point = point->next;
        }
        cout << endl;
    }
};

int main()
{
  ////////////////THE PART WHERE I EXTRACT INFORMATION FROM THE INPUT FILE
    ifstream file("paldies.in", ifstream::binary);
    fstream file2;
    file2.open("paldies.out", ios::out);
    if (!file)
    {
        cout << "Error desune!";
        return 0;
    }
    file.seekg(0, file.end);
    int length = file.tellg();
    file.seekg(0, file.beg);
    char * buffer = new char[length];
    cout << "Reading " << length << " characters....." << endl;
    file.read(buffer, length);

    if (length == 0)
    {
        char nothing[8] = "Nothing";
        file2.write(reinterpret_cast<char*>(nothing), 8 * sizeof(char));
        file.close();
        file2.close();
        return 0;
    }

    if (file)
    {
        cout << "all characters read succesfully.";
    }
    else
    {
        cout << "error: only " << file.gcount() << " could be read";
    }
    file.close();

////////////////////////////THIS IS THE PART THATS NOT WORKING FOR ME

    List a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;

    for (buffer; *buffer != '\0'; buffer++)
    {
        if (buffer[0] == 's')
        {
        char s_begining[255] = "";

            for (int i = 0; buffer[0] != ' '; i++)
            {
                s_begining[i] = buffer[0];
                buffer++;
            }
            s.createnode(s_benining);
        }
        buffer++;
    }

cout << endl<<buffer<<endl;



    s.display();
    file2.close();
    return 0;
}

Ввод: Спрингфилд, Филадельфия, Детройт, Кливленд, Майами, Денвер, Спрингфилд, Сиэтл, Джексонвилл

Правильный вывод: Кливленд Денвер Детройт Джексонвилл Майами Филадельфия Сиэтл Спрингфилд Спрингфилд

Фактический вывод: так как я просто проверяю букву s, он выступает в качестве пружинного поля только один раз, если я изменю объявление char s_begining за пределы оператора if или цикла, он дает разные результаты.

У меня такое ощущение, что проблема где-то в первом цикле for, потому что, когда я его вынимаю, первый элемент попадает в список просто замечательно, но когда я возвращаюсь, иногда возникает исключение, ничего не происходит (пустой список) , или в списке есть 4 входа с данными мусора.

Также, если я удалю буфер ++; в конце первого цикла for он также разбивает вещи.

До сих пор я правильно получил 1 название города в списке, и это первое (Спрингфилд).

РЕДАКТИРОВАТЬ: я забыл упомянуть, что мне разрешено использовать только библиотеку fstream, все остальное должно быть написано мной!

1 Ответ

0 голосов
/ 12 мая 2019

Многое из того, что вы пытаетесь сделать, может быть достигнуто с помощью STL :

#include <algorithm>
#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main() {
    // 0. Set up variables
    std::ifstream inFile("pladies.in");
    std::ofstream outFile("pladies.out");
    std::vector<std::string> cities;

    // 1. Read each line of the input file to a vector
    std::string line;
    while (std::getline(inFile, line)) {
        cities.push_back(line);
    }

    // 2. Sort the vector alphabetically
    std::sort(cities.begin(), cities.end());

    // 3. Write the vector to the output file
    std::copy(cities.begin(), cities.end(), std::ostream_iterator<std::string>(outFile, "\n"));
}

( repl.it )

...