Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502

    [C] ordinare delle righe

    Ho n file di testo il cui nome è passato come parametro, devo creare un file di testo contenente tutte le righe dei file ordinate lessicograficamente.
    Supponendo di dover usare la funzione qsort, i problemi sostanzialmente sono:

    1)Mi creo un buffer gigantesco dove copiare tutte le righe e poi ordinare o cosa?
    2)La funzione qsort vuole fra i vari parametri la dimensione di un singolo elemento dell'array. Ma qui ogni elemento (la riga di testo) ha una sua dimensione.

  2. #2

    Re: [C] ordinare delle righe

    Ti crei un array di tanti puntatori a stringa quante sono le righe, ciascuno dei quali puntatori punta alla stringa contenente la riga corrispondente che avrai caricato in precedenza. Quindi passi a qsort l'array di puntatori dicendogli di usare come funzione di confronto una funzione che avrai definito in questo modo:
    codice:
    int cmplines(void *arg1, void *arg2)
    {
    
        return strcmp(*(char **)arg1,*(char **)arg2);
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502

    Re: Re: [C] ordinare delle righe

    Originariamente inviato da MItaly
    Ti crei un array di tanti puntatori a stringa quante sono le righe, ciascuno dei quali puntatori punta alla stringa contenente la riga corrispondente che avrai caricato in precedenza. Quindi passi a qsort l'array di puntatori dicendogli di usare come funzione di confronto una funzione che avrai definito in questo modo:
    codice:
    int cmplines(void *arg1, void *arg2)
    {
    
        return strcmp(*(char **)arg1,*(char **)arg2);
    }
    .

    1)Come so quanto sarà grande l'array a priori?
    2)Credo di non aver intuito come funziona l'algoritmo che mi hai detto per ordinare le righe

  4. #4

    Re: Re: Re: [C] ordinare delle righe

    Originariamente inviato da matrics
    1)Come so quanto sarà grande l'array a priori?
    Credo che ti convenga contare le righe e poi allocare dinamicamente l'array di puntatori.
    2)Credo di non aver intuito come funziona l'algoritmo che mi hai detto per ordinare le righe
    Io non ti ho detto alcun algoritmo, ti ho solo suggerito come usare la funzione qsort in questo caso... dai un'occhiata alla documentazione, poi eventualmente chiedi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di matrics
    Registrato dal
    Jul 2004
    Messaggi
    502

    Re: Re: Re: Re: [C] ordinare delle righe

    Originariamente inviato da MItaly
    Credo che ti convenga contare le righe e poi allocare dinamicamente l'array di puntatori.

    Io non ti ho detto alcun algoritmo, ti ho solo suggerito come usare la funzione qsort in questo caso... dai un'occhiata alla documentazione, poi eventualmente chiedi.

    ma il funzionamento della qsort lo conosco, i dubbi li ho sul buffer e sulla dimensione del dato

  6. #6
    Allora, mi spiego meglio; leggi il file e verifichi quante righe ci sono; memorizzi tale numero in una variabile (diciamo numRighe), quindi:
    codice:
    rewind(fs); //supponendo che lo stream si chiami fs
    char ** righe=calloc(numRighe, sizeof(char *));
    char bufriga[8192]; //ampliabile a piacimento
    for(int riga=0;riga<numRighe;riga++)
    {
        fgets(bufriga, sizeof(bufriga)/sizeof(char), fs);
        if(ferror) break;
        bufriga[sizeof(bufriga)/sizeof(char)-2]='\n'; //si assicura che il newline ci sia sempre
        righe[counter]=calloc(strlen(bufriga)+1, sizeof(char));
        strcpy(righe[counter], bufriga);
    }
    qsort(bufriga, numRighe, sizeof(char *), cmplines);
    //...chiusura del file di input, apertura del file di output...
    //supponiamo che quest'ultimo si chiami os
    //...
    for(int riga=0;riga<numRighe; riga++)
    {
        fputs(righe[riga],os); //stampa il valore
        free(righe[riga]); //dealloca la memoria
    }
    free(righe);
    //...chiusura del file di output, varie ed eventuali...
    //...
    int cmplines(void *arg1, void *arg2)
    {
        return strcmp(*(char **)arg1,*(char **)arg2);
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.