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

    [C] Contarighe file testo

    codice:
    void fusione(FILE *alfa, FILE *beta, FILE *gamma, int *contAlfa, int *contBeta, int *contGamma)                
    {
     char nome[10],nome2[10],simbolo[10],simbolo2[10];               
     float natom,natom2;
     int num,num2;
        
        fscanf(alfa, "%s%s%f%d", nome, simbolo, &natom, &num);
        fscanf(beta, "%s%s%f%d", nome2, simbolo2, &natom2, &num2);
              
        while(!feof(alfa) && !feof(beta))                                   
        {                                                                  
         if(strcmp(nome, nome2) < 0)                                       
          {fprintf(beta, "%s \t%s \t%f \t%d\n", nome, simbolo, natom, num);
            fscanf(alfa, "%s%s%f%d", nome, simbolo, &natom, &num);}
            else
               {
                   if(strcmp(nome, nome2) > 0)
                    {fprintf(gamma, "%s \t%s \t%f \t%d\n", nome2, simbolo2, natom2, num2);
                     fscanf(beta, "%s%s%f%d", nome2, simbolo2, &natom2, &num2);}
                         else
                        {num = num + num2;
                         fprintf(gamma, "%s \t%s \t%f \t%d\n", nome, simbolo, natom, num);
                         fscanf(alfa, "%s%s%f%d", nome, simbolo, &natom, &num);
                         fscanf(beta, "%s%s%f%d", nome2, simbolo2, &natom2, &num2);}
               }
           } 
               
        if(feof(beta))                                                  
         {                                                              
          while(!feof(alfa))
          {fprintf(gamma, "%s \t%s \t%f \t%d\n", nome, simbolo, natom, num);
              fscanf(alfa, "%s%s%f%d", nome,&simbolo, &natom, &num);}
              fprintf(gamma, "%s \t%s \t%f \t%d\n", nome, simbolo, natom, num);
         }
           else
           {
            if(feof(alfa))
             {
              while(!feof(beta))
                {fprintf(gamma, "%s \t%s \t%f \t%d\n", nome2, simbolo2, natom2, num2);
                  fscanf(beta, "%s%s%f%d",&nome2, simbolo2, &natom2, &num2);}
              fprintf(gamma, "%s \t%s \t%f \t%d\n", nome2, simbolo2, natom2, num2);
             }
           }
    }
    Salve a tutti, vi descrivo il mio problemino:
    ho questo modulo che tratta due file esterni in input (alfa e beta) e ne produce uno esterno (gamma), nei due file in input troviamo i dati relativi ad alcuni elementi chimici e deve scrivere nel file esterno tutti gli elementi una sola volta sommando eventualmente le quantità (ultima voce di ogni riga che rappresenta un elemento chimico) degli elementi che si trovano sia in alfa che in beta.

    Il programma gira tranquillamente e mi produce correttamente il file gamma, l'unico mio problema è che devo inserire un contatore di righe di alfa, beta e gamma usando i 3 contatori contAlfa, contBeta e contGamma.
    Sto avendo seri problemi nel capire dove introdurre l'incremento dei contatori (*contAlfa = *contAlfa + 1).

    Ringrazio in anticipo chi vorrà aiutarmi ^^

  2. #2
    Quello che ti consiglio è di usare la funzione fgets in un ciclo che non finirà fin quando il suo valore non sarà NULL (fgets ritorna NULL se non ci sono più righe) in cui incrementi il contatore:


    #define MAX_LENGHT 1000 // Lunghezza massima di una stringa

    char *p;--------------->// Puntatore che conterrà il valore di ritorno della funzione fgets();
    buff[MAX_LENGHT];->// Buffer in cui andrai a mettere il contenuto delle righe
    int contAlfa=0;------->// Contatore

    do{
    p=fgets(buff, MAX_LENGHT, alfa);
    contAlfa++;
    }while(p);
    --contAlfa;

    Ovviamente, devi adattarlo al tuo programma, questa è soltanto una bozza

  3. #3
    Innanzitutto ti ringrazio per la risposta.
    Questo metodo è quello che avevo pensato io ma il prof insiste sul fatto che il problema si risolve inserendo semplicemente l'incremento del contatore all'interno del modulo sfruttando i cicli che già ci sono sfruttando i (while != feof(alfa)) e sinceramente proprio non sto capendo..
    Comunque ora provo con il metodo della fgets ^^

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    while(!feof(fp))
        counter+=fgetc(fp)=='\n';

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da Who am I
    codice:
    while(!feof(fp))
        counter+=fgetc(fp)=='\n';
    Bellissima soluzione Who! Ma poco comprensibile, io aggiungerei almeno un operatore ternario ? :
    Comunque veramente ottima!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Originariamente inviato da Who am I
    codice:
    while(!feof(fp))
        counter+=fgetc(fp)=='\n';
    Adattando queste due linee al mio programma non mi funziona ma credo proprio che sto facendo casino io con i vari puntatori tra modulo e main

    poi ho provato ad inserire questo frammento all'inizio del modulo

    codice:
    while ((ch = fgetc(alfa)) != EOF)
        *contAlfa = *contAlfa + 1;
    ma mi manda tutto in loop...

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Ma hai capito come funzione il codice di Who?
    codice:
    while(!feof(fp)) //controlla se si è giunti alla fine del file
        counter+=(fgetc(fp)=='\n'); //legge un carattere, se è uguale a '\n' la condizione varrà 1, altrimenti 0
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Usa queste funzioni:
    feof come condizione del while, controlla la fine del file.
    fget legge una riga.
    incrementi il contatore.
    lavori con sscanf sulla stringa letta con fget.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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