Operacje na plikach - alfabetyczne sortowanie zawartosci pliku txt

0

Hej,
Mam plik.txt o nazwie "lista" a w nim imiona i nazwiska:

Jan Kowalski
Anna Nowak
Jarosław Kaczor
Donald Kieł

Probuje napisac program sortujacy osoby alfabetycznie. Niestety caly czas otrzymuje wynik posortowanych liter dla Jana Kowalskiego:

JKaaiklnosw
Anna Nowak
Jarosław Kaczor
Donald Kieł

kod:

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

int main()
{

    
    fstream file,file2;
    int  j = 0,k=0;
    string* buffer,tmp;
    file.open("lista.txt", ios::in);

    if (file.is_open()) {

        while (!file.eof()) {
                   
            getline(file, tmp);
            
            j++;                               
        }
       
        file.seekg(0, ios::beg);
        buffer = new string[j];
        
        while(!file.eof()){



            getline(file, buffer[k]);
            k++;

        }
        file.close();
       // for (int i = 0; i < k; i++) {
       //     cout << buffer[i] << endl;
      //  }
        sort(buffer->begin(), buffer->end());
        k = 0;
        file2.open("sorted.txt", ios::out);
        if (file2.is_open()) {
            while(k<j){
                
                file2 << buffer[k] << endl;
                k++;

            }
        }
        else {
            cout << "Nie udalo sie stworzyc/otworzyc pliku sorted.txt" << endl;
        }
        file2.close();
    }
    else {
        cout << "Nie udalo sie poprawnie otworzyc pliku" << endl;
    }
    
    return 0;
}

Dlaczego funkcja sort w tym przypadku sortuje tylko litery dla elementu buffer[0]?
Pierwszego while uzylem po to, aby zliczyc ilosc wierszy w pliku. Jak mozna inaczej to zrobic?
Jesli macie jakies sugestie lub wskazowki co do smaego kodu to tez chetnie przeczytam :)

1
Grantuser napisał(a):

Jesli macie jakies sugestie lub wskazowki co do smaego kodu to tez chetnie przeczytam :)

Zamiast string* buffer zrób sobie vector i do niego dodawaj wczytywane linie.

Grantuser napisał(a):

Dlaczego funkcja sort w tym przypadku sortuje tylko litery dla elementu buffer[0]?

Domyślam się, że wywołując sort(buffer->begin(), buffer->end()); sortujesz tylko litery pierwszego elementu tablicy.
"Goła" tablica stringów nie posiada metod begin() i end(). Zapewne kod się kompiluje dlatego, że używasz begin() i end należące do stringa.

Vector też ma begin() i end(). Jak już użyjesz vector, to możesz zaprogramować dowolny sposób porównywania łańcuchów:
https://stackoverflow.com/a/2907145/1639851

2
  1. Podziel kod na małe cześci - funkcje. Coś do wczytywania, coś do sortowania, coś do wypisywania wyniku.
  2. https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete użyj std::vector
  3. chciałeś tak:
sort(buffer, buffer + j);

bo *buffer reprezentuje pierwszy element, a buffer->begin() to iterator do pierwszej litery pierwszego elementu.

2

Popatrz na to:

#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>

using Data = std::vector<std::string>;
namespace fs = std::filesystem;

Data loadData(std::istream& in)
{
    Data data;
    data.reserve(1000);
    std::string line;
    while (std::getline(in, line))
    {
        data.push_back(line);
    }
    return data;
}

Data loadData(const fs::path& p)
{
    std::ifstream in{p};
    if (in)
    {
        return loadData(in);
    }
    std::perror(p.string().c_str());
    return {};
}

void saveData(std::ostream& out, const Data& data)
{
    for (auto& s : data)
    {
        out << s << '\n';
    }
}

void saveData(const fs::path& p, const Data& data)
{
    std::ofstream out{p};
    if (out)
    {
        return saveData(out, data);
    }
    std::perror(p.string().c_str());
}

int main()
{
    auto data = loadData("lista.txt");
    std::sort(data.begin(), data.end());
    saveData("sorted.txt", data);
    // saveData(std::cout, data);

    return 0;
}

https://wandbox.org/permlink/uzgcx3oFkG6zWJMk

1 użytkowników online, w tym zalogowanych: 0, gości: 1