Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] conta righe testo

  1. #1

    [C] conta righe testo

    Salve a tutti.
    Sarà che è perché sono molto arrugginito, sarà perché non sono mai stato una cima nella programmazione, ma non riesco più a contare il numero di righe presenti in un testo.
    codice:
      
    #include <stdio.h>
    int main(){
    	char buff[17];
    	int i=0;
    	FILE *fptr=fopen("tpiloti1.txt","r");
    	while(fgets(buff,sizeof(buff),fptr))
    	++i;
    	printf("i=%d",i);
    	return 0;
    
    }
    Se "tpiloti.txt" è una lista di "n" nomi (uno sotto l'altro), perché "i" sembra darmi numeri casuali?
    Il ciclo while non dovrebbe essere eseguito finché fgets non incontra il carattere di terminazione del file?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    forse 17 chars per buf sn pochi. Cmq controlla anche fopen.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Non credo sia un problema di dimensioni del vettore dato che comunque viene sovrascritto ad ogni chiamata.
    PS per scrupolo ho provato a modificarne le dimensioni, senza risultato.

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    fgets si ferma di leggere al raggiungimento della dimensione del buffer, se trova un ritorno a campo o alla fine del file.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ciao...ho dato uno sguardo al codice e sembra corretto....mi sembra strano che ti stampi numeri casuali per la variabile i....l'unica cosa possibile è che ci siano nomi più lunghi di 17 caratteri e allora si verifica qualche problema.
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    L'uso di fgets e del buffer è inutile e complica la questione.
    codice:
    #include <stdio.h>
    
    int main()
    {
        int i=0;
        char c;
        FILE *fptr=fopen("tpiloti1.txt","r");
        while ((c=fgetc(fptr))!=EOF)
            if(c=='\n')
                i++;
        printf("i=%d",i);
        return 0;
    
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    @MItaly:
    ma comunque la fgets() funziona e fa quello che deve fare...se poi andiamo a vedere dalla parte di sicurezza e problemi di eventuali buffer overflow...allora la fgets() genera questi tipi di incovenienti...però comunque sintatticamente e logicamente il programma cn la fgets() è corretto?
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  8. #8
    No. In primo luogo, come già è stato detto, se le righe sono più lunghe di 16 caratteri (newline incluso) la fgets copierà al massimo 16 caratteri, per andare avanti con la riga all'iterazione successiva. Ciò significa che righe più lunghe di 16 caratteri verranno contate più volte.
    Inoltre credo che sia più corretto avere come condizione di uscita fgets(...)!=EOF, anche se non credo che ci possano essere delle righe di 0 caratteri, dato che il \n è sempre considerato come carattere da copiare.

    Comunque, ribadisco, dato che la fgets in questo caso dà solo fastidio non ha molto senso utilizzarla. Se la fgetc risulta poi essere un bottleneck per le prestazioni, allora può avere senso riscrivere il tutto usando direttamente la fread e leggendo a blocchi, il che è sicuramente più veloce dell'uso della fgets.
    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.