Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c] problema esercizio file e stringhe

    ciao raga

    allora ho un problema con un esercizio

    ho un file di testo con su scritto la lunghezza di ogni parola e laparola stessa
    esempio

    4ciao
    5forum
    7servizi

    devo visualizzare la lunghezza ed dei primi 3 caratteri di ogni stringa contenuta nel file
    e devo calcolare la somma dlle lunghezze delle stringhe

    qundi in output

    riga=4
    cia
    riga=5
    for
    riga=7
    ser

    somma totale parole = 16

    purtroppo mi legge troppe righe in più

    devo usare io a basso livello (read e write)

    mi date una mano?

    codice:
    #include<stdlib.h>
    #include<stddef.h>
    #include<stdio.h>
    #include<string.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    
    int fd,i,j,k,c;
    int tot=0;
    int riga=0;
    char stringa[50];
    char num[10];
    int main(int argc ,char **argv)
    {
      fd =open(argv[1],O_RDONLY,0777);
        {
          while(read(fd,num,1)>0)
           {
             i=atoi(num);
             printf("riga = %d\n",i);
             read(fd,stringa,i-1);
             write(1,stringa,3);
             write(1,"\n",2);
             
             tot=tot+i;
            
            }
         }
    printf(" somma totale parole = %d\n",tot);   
    
    }

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ehi ciao...onestamente non sono molto esperto sull'utilizzio di queste particolari fnzioni di lettura...però per un periodo le ho dovute usare per alcuni esercizi...spero di ricordare qualcosa...cmq...ti da quel problema xkè tu nel ciclo leggi solo un pezzo della parola con la read e quindi quando torna al ciclo while() quella read t va in "crash" penso e legge cose che non sono compito suo! quindi basta leggere altre 2 volte...così:
    codice:
    ...
    int main( )
    {
      fd =open("file.txt",O_RDONLY,0777);
        {
          while(read(fd,num,1)>0)
           {
             i=atoi(num);
             printf("riga = %d\n",i);
             read(fd,stringa,i-1);
             write(1,stringa,3);
             write(1,"\n",2);
             read(fd,num,1);
             read(fd,num,1);
             tot=tot+i;
            
            }
         }
    ...
    dovrebbe andare anche se sicuramente c'è un modo per risolvere anche senza leggere ma semplicemente usando la lseek() e posizionare il puntatore al posto corretto in modo da far leggere correttamente la read() nel ciclo!

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    trovato...se non ricordo male al posto delle 2 read() che ho inserito, si può fare anche così:
    codice:
    ...
    int main( )
    {
      fd =open("file.txt",O_RDONLY,0777);
        {
          while(read(fd,num,1)>0)
           {
             i=atoi(num);
             printf("riga = %d\n",i);
             read(fd,stringa,i-1);
             write(1,stringa,3);
             write(1,"\n",2);
             lseek(fd,3,SEEK_CUR);
             tot=tot+i;
            
            }
         }
    ...
    dove la funzione lseek() serve per posizionare l'indicatore a nostro piacimento, in questo caso rimane posizionato dove era precedentemente(SEEK_CUR) e gli viene aggiunto il valore dell'offset (3) in modo da saltare i dati che non devono essere letti! Spero sia corretto...magari qualcuno più preparato saprà spiegarti meglio!

  4. #4
    allora si funziona facendo le due letture in più

    ora però mi si pongono due domande

    1) PERCHE' leggere due volte in più? forse c'è il \n dopo ogni parola in un file di testo e siccome non si vede va in crash?

    2) per valori più grandi di 9 come faccio dato che converte solo il primo numero?

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    si con le letture va...ma comunque secondo me è più corretto usare la lseek() perchè in quel modo non leggi niente e sposti soltato l'indicatore...che è quello che serve a te...e comunque penso che serve fare questo perchè tu non leggi tutta la parola ma leggi solo quella che ti interesa...ovvero le prime 3 lettere...quindi rimane il resto della parola più eventuali caratteri tipo tabulatura(\t), spazi, accapi(\n).
    per quanto riguarda la seconda domanda...onestamente non saprei dirti in questo momento...se mi viene qualche idea t faccio sapere...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.