Как читать данные из файла csv с помощью быстрой сортировки и отображать их

Могу ли я узнать, как лучше всего решить эту проблему, так как в настоящее время я новичок в C++

Результат, который я ожидал, был примерно таким

 id, title, price, date, mileage, fuel_type, transmission, engine_size, doors, colour, body_type, url, sale_date
3   ,Volkswagen Golf 1.9 TDI 11 Months MOT  ,650    ,2000   ,155822 Diesel  ,Manual ,1.9    ,4  ,Silver ,Hatchback  ,https://www.ebay.co.uk/itm/124907646705?hash=item1d15136ef1:g:8dsAAOSwb-thRawR  ,25 Sep 2021
4   ,1999 Volkswagen Golf GTi 1.8 turbo AUM engine V20  British racing green 3 door     ,650    ,1999   ,178000 ,Petrol ,Manual ,1.8    ,3  ,Green  ,Hatchback  ,https://www.ebay.co.uk/itm/114998243091?hash=item1ac66def13:g:7y4AAOSwSEdhL~1m  ,25 Sep 2021

Но результат у меня такой

3.  - 0 - -858993460 - -858993460 -  -  -  - -858993460 -  -  -  -
4.  - 1999 - 0 - -858993460 -  -  -  - -858993460 -  -  -  -
5.  - 0 - 0 - -858993460 -  -  -  - -858993460 -  -  -  -
6.  - 5 - 0 - -858993460 -  -  -  - -858993460 -  -  -  -

Я пробовал много разных способов сделать это, но я все еще пытаюсь найти способ правильно распечатать все входные данные из CSV-файла. Поскольку он может читать по идентификатору, но не может печатать все данные из строки конкретно.

Это мой код


    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    using namespace std;
    
    int sizeofLinkedList = 0;
    struct Car
    {
    
        int id;
        string title, fuel_type, transmission, engine_size,  colour, body_type, url, sale_date;
        int price;
        int year;
        int mileage;
        int doors;
    
        Car* nextAddress;
        Car* prevAddress;
    } *head, * tail;
    
    Car* CreateNewNnode(int id, string title, int price, int year, int mileage ,string fuel_type, string transmission,
        string engine_size, int doors, string colour, string body_type, string url, string sale_date) //create a newnode - use for any insert
    {
    
    
        Car* newnode = new Car;
        newnode->id = id;
        newnode->title = title;
        newnode->price = price;
        newnode->year = year;
        newnode->mileage = mileage;
        newnode->fuel_type = fuel_type;
        newnode->transmission = transmission;
        newnode->engine_size = engine_size;
        newnode->doors = doors;
        newnode->colour = colour;
        newnode->body_type = body_type;
        newnode->url = url;
        newnode->sale_date = sale_date;
        newnode->nextAddress = NULL;
        newnode->prevAddress = NULL;
        return newnode;
    }
    
    Car* partition(Car* head, Car* end, Car** newHead, Car** newEnd)
    {
        Car* pivot = end;
        Car* prev = NULL, * cur = head, * tail = pivot;
    
        while (cur != pivot)
        {
    
            if (cur->id < pivot->id)
            {
                if ((*newHead) == NULL)
                    (*newHead) = cur;
    
                prev = cur;
                cur = cur->nextAddress;
            }
            else
            {
                if (prev)
                    prev->nextAddress = cur->nextAddress;
    
                Car* tmp = cur->nextAddress;
                cur->nextAddress = NULL;
                tail->nextAddress = cur;
                tail = cur;
                cur = tmp;
            }
        }
    
        if ((*newHead) == NULL)
            (*newHead) = pivot;
    
        (*newEnd) = tail;
    
        return pivot;
    }
    
    
    
    Car* getTail(Car* cur)
    {
        while (cur != NULL && cur->nextAddress != NULL)
            cur = cur->nextAddress;
    
        return cur;
    }
    
    Car* quickSortRecur(Car* head, Car* end)
    {
        if (!head || head == end)
            return head;
    
        Car* newHead = NULL, * newEnd = NULL;
        Car* pivot = partition(head, end, &newHead, &newEnd);
    
        if (newHead != pivot)
        {
            Car* tmp = newHead;
            while (tmp->nextAddress != pivot)
                tmp = tmp->nextAddress;
    
            tmp->nextAddress = NULL;
            newHead = quickSortRecur(newHead, tmp);
            tmp = getTail(newHead);
            tmp->nextAddress = pivot;
        }
    
        pivot->nextAddress = quickSortRecur(pivot->nextAddress, newEnd);
    
        return newHead;
    }
    
    void quickSort(Car** headRef)
    {
        (*headRef) = quickSortRecur(*headRef, getTail(*headRef));
    }
    
    // Modified insertIntoASortedList to use quicksort
    void insertIntoASortedList(Car* newnode)
    {
        // Insert new node at the end of the list
        if (head == NULL)
        {
            head = tail = newnode;
        }
        else
        {
            tail->nextAddress = newnode;
            newnode->prevAddress = tail;
            tail = newnode;
        }
    
        // Sort the list using quicksort
        quickSort(&head);
    }
    
    void readCsvFile() {
        ifstream file("carlist(1).csv");
        string line;
        int id;
        string title, fuel_type, transmission, engine_size, colour, body_type, url, sale_date;
        int price;
        int year;
        int mileage;
        int doors;
    
        while (getline(file, line)) {
            stringstream ss(line);
            int id;
            string title, fuel_type, transmission, engine_size, colour, body_type, url, sale_date;
            int price;
            int year;
            int mileage;
            int doors;
    
            ss >> id;
            getline(ss, title, ',');
            ss >> price;
            ss >> year;
            ss >> mileage;
            getline(ss, fuel_type, ',');
            getline(ss, transmission, ',');
            getline(ss, engine_size, ',');
            ss >> doors;
            getline(ss, colour, ',');
            getline(ss, body_type, ',');
            getline(ss, url, ',');
            getline(ss, sale_date, ',');
    
    
            Car* newnode = CreateNewNnode(id, title, price, year, mileage, fuel_type, transmission, 
                engine_size, doors, colour, body_type, url, sale_date);
            insertIntoASortedList(newnode);
        }
    }
    
    
    
    void SearchBasedOnPrice(int price1, int price2)
    {
        Car* current = head;
    
        while (current != NULL)
        {
            if (current->id >= price1 && current->id <= price2)
            {
                cout << current->id << ". " << current->title << " - " << current->price << " - "
                    << current->year << " - " << current->mileage << " - " << current->fuel_type << " - "
                    << current->transmission << " - " << current->engine_size << " - " << current->doors << " - "
                    << current->colour << " - " << current->body_type << " - " << current->url << " - "
                    << current->sale_date << endl;
            }
            current = current->nextAddress;
        }
        cout << "List ended here!" << endl;
    }
    
    int main()
    {
        head = NULL;
    
        srand(time(0));
        int noOfcar, choice = 1;
        int CarID, Year;
        string Brand, Type, color;
        int p1;
        int p2;
    
        cout << "Enter your searching p1: ";
        cin >> p1;
        cout << "Enter your searching p2: ";
    
        cin >> p2;
        readCsvFile();
        SearchBasedOnPrice(p1, p2);
    
    
        cout << endl;
        int answer; string word;
        cout << "Do you want to search anything from the list or not? 1 - Yes, 0 - No: ";
        cin >> answer;
        cin.ignore();
    
    
        while (answer == 1)
        {
    
    
            cout << "Enter your searching p1: ";
            cin >> p1;
            cout << "Enter your searching p2: ";
    
            cin >> p2;
            readCsvFile();
            SearchBasedOnPrice(p1, p2);
    
            cout << "Do you want to edit anything? 1 - Yes, 0 - No: ";
            cin >> answer;
    
            int CarID;
            if (answer == 1)
            {
                cout << "Enter your car ID: ";
                cin >> CarID;
                
            }
    
            cout << "Do you still want to search anything from the list or not? 1 - Yes, 0 - No: ";
            cin >> answer;
            cin.ignore();
            system("pause");
            system("cls");
        }
        return 0;
    }

-858993460 == 0xCCCCCCCC. Это неинициализированная переменная (в некоторых системах/настройках). Ваша функция readCsvFile() не проверяет, не завершились ли большинство ваших файловых операций сбоем.
Drew Dormann 18.02.2023 21:14
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код неверен

        ss >> id;
        getline(ss, title, ',');
        ss >> price;
        ss >> year;
        ss >> mileage;

Подумайте об этом формате id,title,price,year,mileage etc. Там четыре запятые, но приведенный выше код читает только одну запятую, так что это не может быть правильным.

Вот код, который должен работать лучше

        string tmp;
        getline(ss, tmp, ',');
        id = stoi(tmp);
        getline(ss, title, ',');
        getline(ss, tmp, ',');
        price = stoi(tmp);
        getline(ss, tmp, ',');
        year = stoi(tmp);
        getline(ss, tmp, ',');
        mileage = stoi(tmp);

Этот код считывает все запятые, но там, где требуется целое число, он считывает данные в строку tmp, а затем использует stoi для преобразования строки в целое число.

Когда я использую только «getline (ss, tmp, ','); id = stoi (tmp);» он может работать, но когда я следую приведенному выше коду, появляется сообщение об ошибке, в котором говорится, что abort() был вызван, и я не могу найти, почему, хотя ваш код правильный

Myste Myzte 19.02.2023 10:46

@MysteMyzte Прерывание, вероятно, произойдет из-за того, что вы использовали stoi в строке, которую нельзя преобразовать в целое число (потому что она пуста или не является числовой). Распечатайте значение строки перед вызовом stoi и посмотрите, что получится. Это отладка, это нормальная часть программирования. Конечно, если вы умеете пользоваться отладчиком, это облегчит вам задачу.

john 19.02.2023 12:00

Другие вопросы по теме