Leggere una parola singola da una riga di un file!

di il
15 risposte

Leggere una parola singola da una riga di un file!

Salve a tutti, devo fare un esercizio in linguaggio C e mi sono bloccato nella parte dove mi dice di stampare a video una determinata parola prelevata da una determinata riga di un file di testo;

faccio un esempio: se l'utente digita il numero 2 e 3, devo prelevare la seconda parola della terza riga!

Grazie in anticipo!

15 Risposte

  • Re: Leggere una parola singola da una riga di un file!

    Devi leggere il file contando le righe e trovata la riga usi la strtok per contare le parole fino s quella che ti serve

  • Re: Leggere una parola singola da una riga di un file!

    21/07/2023 - oregon ha scritto:


    Devi leggere il file contando le righe e trovata la riga usi la strtok per contare le parole fino s quella che ti serve

    Grazie provo e poi posto il codice 

  • Re: Leggere una parola singola da una riga di un file!

    Sto provando questo esercizio (è una prova d'esame), non vorrei la soluzione per intero, ma solo qualche indicazione su come continuare!

    Questa la traccia:

    “Si scriva un programma che, dato un file in ingresso contenente un messaggio nascosto, ne estragga un messaggio segreto, utilizzando come coordinate una sequenza di numeri che ne indicano rigo e posizione della parola. Se la sequenza inserita è 1-1, 2-1, 3-4 ,4-3, vuol dire bisogna estrarre la prima parola del primo rigo, la prima parola del secondo rigo, la quarta parola del terzo rigo e la terza parola del quarto rigo, avendo così come output un messaggio segreto!”

    Utilizzo la funzione fgets per leggere un'intera riga da file, ma poi non riesco a capire come collegare la coppia di numeri inseriti dall'utente alla coppia riga - parola contenuta nel file!

    Ripeto non vorrei ricopiare il codice già fatto, ma solo un input per poi provare a sviluppare il programma da solo…grazie!

  • Re: Leggere una parola singola da una riga di un file!

    Ti avevi già dato il suggerimento e avevi detto che provavi. Dov'è questa prova?

    Hai riproposto il problema ma il suggerimento è sempre lo stesso.

    Certe volte mi sembra di stare su “scherzi a parte"…

  • Re: Leggere una parola singola da una riga di un file!

    Questo il codice:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define DELIM " .,:;|+-*/?!@_"
    
    int main() {
        char word[100];
        char *res;
        char *token;
        int num_word = 0;
            
        FILE *f_in = fopen("Clients.txt", "r");
        if(f_in == NULL) {
            perror("\n The file could not be opened!\n");
            exit(1);
        }
        
        printf("\n * The text in the file * \n");
        printf(" ************************\n");
        while(!feof(f_in)) {
            res = fgets(word, 100, f_in);
            if(res == NULL) {
                perror("\n The file is empty!\n");
            }
            else
                printf(" %s", word);
        }
        
        token = strtok(word, DELIM);
        while(token) {
            printf("\n Word found: %s\n", token);
            token = strtok(NULL, DELIM);
        }
        
        fclose(f_in);
        
        printf("\n\n The end of run!");
        return 0;
    }
  • Re: Leggere una parola singola da una riga di un file!

    Questo il codice:

    e …. ?

  • Re: Leggere una parola singola da una riga di un file!

    27/07/2023 - oregon ha scritto:


    Questo il codice:

    e …. ?

    Ora sono arrivato qui…(posto soltanto la parte corretta del codice)

    while(!feof(f_in)) {
            res = fgets(word, 100, f_in);
            if(res == NULL) {
                perror("\n The file is empty!\n");
            }
            else {
                token = strtok(word, DELIM);
                while(token) {
                    printf(" %s ", token);
                    token = strtok(NULL, DELIM);
                }
            }
        }

    Mi legge tutto riga per riga…

    ora come associo i numeri (inseriti dall'utente) che poi dovrebbero generare il messaggio cifrato…???

    Spero di essere stato chiaro

  • Re: Leggere una parola singola da una riga di un file!

    Metti un contatore nel ciclo while della feof e un altro contatore nel ciclo while del token (che si azzera all'entrata) e falli visualizzare 

  • Re: Leggere una parola singola da una riga di un file!

    27/07/2023 - oregon ha scritto:


    Metti un contatore nel ciclo while della feof e un altro contatore nel ciclo while del token (che si azzera all'entrata) e falli visualizzare 

    Ho provato a risolvere il problema in maniera più semplice, nel senso che le righe ed il numero di parole, nal mio caso, non so variabili;

    pertanto credo che possa svolgere l'esercizio anche senza usare la funzione strtok.

    Il problema però è sempre lo stesso; cioè dovrei confrontare il numero di una parola per riga con il valore singolo inserito dall'utente (che poi è l'unica cosa che può cambiare), solo che non riesco a fare bene il contronto

    Posto solo la porzione di codice incriminata:

    for (n = 1; fscanf(f_in, "%s", words[n]) != EOF; n++) {
            for(i = 0; i <= DIM2; i++) {
                if(v[n] == v[i])
                    printf(" words[%d] = %s\n", n, words[n]);
            }
        }
  • Re: Leggere una parola singola da una riga di un file!

    E cosa sarebbe v[n] e v[i] ?

    Era meglio il codice con la strtok ma dovevi seguire il consiglio di introdurre e controllate i due contatori (di riga e di parola) e non l'hai fatto.

    Ho l'impressione che questo esercizio vada oltre le tue attuali conoscenze del linguaggio.

  • Re: Leggere una parola singola da una riga di un file!

    Io vedo in realtà una soluzione alternativa, che non richiede nemmeno di porre delle assunzioni sulla lunghezza massima di parole o righe, e non impegnerebbe nemmeno troppa memoria (utile per sistemi “piccoli”)

    si tratta di 

    aprire il file e gestirlo come un flusso di testo 

    leggere carattere per carattere fino alla fine

    se si incontra un termine di riga si incrementa il contatore di riga

    se si incontra un termine di parola (occhio a contare anche il termine di riga come termine di parola) si incrementa il contatore di parola

    se la coppia dei due contatori corrisponde ad una delle coppie memorizzate si manda in out il carattere in corso

  • Re: Leggere una parola singola da una riga di un file!

    È un altro modo ma risparmi solo la memoria per una linea di testo, non chissà cosa.

    E devi fare attenzione ai possibili spazi o caratteri in più che potrebbero esserci dopo ogni parola compresa l'ultima.

    E la visualizzazione va fatta prima di giungere alla parola che si intende ottenere perché dopo è stata persa

  • Re: Leggere una parola singola da una riga di un file!

    Verissimo 

    Io per abitudine preferisco gestire flussi invece che testi “statici” ma è solo questione di gusti

    Comunque il vero vantaggio sarebbe che non serve fare assunzioni sulle lunghezze, sul lungo periodo le assunzioni sono sempre sbagliate, perche 640K basteranno a tutti…

    Per la questione dei fine riga o fine parola ripetuti La soluzione è semplicissima, la lascio da realizzare allo OP, se ne ha voglia

    La visualizzazione si fa semplicemente in “tempo reale” non c'è bisogno di nulla più di quello che ho scritto 

    Quando frequentavo il forum di arduino di cose del genere ne ho scritte svariate

    Compresa una che decifrava “al volo” i messaggi Json leggendoli a un carattere per volta (aveva dei forti limiti, ma il suo sporco lavoro lo faceva)  

  • Re: Leggere una parola singola da una riga di un file!

    In generale va bene, anche io ho scritto un bel po' di codice direttamente per MPU/CPU (dalla 65xx, a Z80, 808x e successive, ST, varie famiglie Microchip …) e in quei casi la gestione della memoria è certamente importante.

    Per quanto riguarda questo thread, valuto di più la parte “didattica” ovvero come l'utente è stato abituato nel suo corso di studi. Altri tipi di approcci, forse, potrebbero distrarlo e/o confonderlo, anche se leciti e anche migliori.

    Approcciare a gestire un flusso significa, in maniera embrionale, gestire una macchina a stati, e la cosa potrebbe risultatare efficiente e funzionante. Ma se l'esperienza non è sufficiente, allora ci si può bloccare e non riuscire a terminare il codice.

    Con l'approccio, lettura linea in un buffer e gestione del contenuto del buffer, probabilmente si è più aderenti a quanto studiato.

Devi accedere o registrarti per scrivere nel forum
15 risposte