Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    6

    file in c

    salve a tutti,

    ho iniziato a studiare il C e sono arrivato a studiare i file.. ora sto cercando di fare un programma che mi legga i dati in un file e mi faccia delle operazioni..

    questi sono i dati nel file in input..
    3 6
    3
    1
    2
    2 1
    1 2
    1 3
    2 3
    2 1
    3 1

    i primi due rappresentano 1) il numero di oggetti, 2) il numero di operazioni..
    vorrei sapere come faccio a mettere il "3" e il "6" in due variabili diverse e poi con questi due dati mi creo due cicli uno dietro l'altro.. il "6" rappresenta il numero di operazioni e il "3"il numero di oggetti da mettere dentro un array i 3 numeri di sotto( 3,1,2) mentre l'altro mi esegue delle operazioni ad esempio 2 1, scambio i 2 e 1 di posizione nell'array formato prima e cosi via con gli altri dati..

    non so se sono riuscito a farvi capire il mio problema..

  2. #2
    vorrei sapere come faccio a mettere il "3" e il "6" in due variabili diverse
    Se hai iniziato a studiare i file suppongo che avrai visto la fscanf... in ogni caso, posta il codice che hai iniziato a scrivere e ci ragioniamo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3

    Moderazione

    Tra parentesi, mi sono permesso di modificare il titolo rendendolo un po' più significativo e sistemando il tag del linguaggio di riferimento, in futuro ricordati di impostare correttamente il titolo fin da subito (a tal proposito, suggerisco di dare un'occhiata al regolamento di sezione se non l'hai già fatto).

    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    6
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int start[100];
      int nv, ns;
      int winner;
      int app;
      int i;
      int empy;
      
      FILE *fp;
      fp= fopen("input.txt","r");
      i=0;
                          while ((empy=fgetc(fp) )!=EOF) {
    empy=fgetc(fp); 
    printf ("%d\n", empy);
    
                        start[i]=empy;
                        i++;
                        }
    
    fclose(fp);
                          
      system("PAUSE");	
      return 0;
    }
    sono nuovo non ho avuto tempo di leggere la guida mi metto subito a leggerla.. ho scritto questo codice che dovrebbe semplicemente mettermi i dati nell'array... quando lo mando in esecuzione però e ne visualizzo il contenuto tramite la chiamata a printf che mi stampa il valore della variabile, mi escono numeri che non sono presenti nel file.. mi escono solo i numeri 32 e 10... ho da poco iniziato quest'argomento e non riesco a trovare l'errore.. p.s ci sono variabili che mi serviranno solo successivamente, potete anche non calcolarle...

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Il tutto dipende da come hai scritto su file.
    Se hai scritto i numeri in binario, oppure li hai scritti come stringhe numeriche.
    In ogni caso la fgetc legge un singolo carattere, non un numero, per cui in entrambi i casi il tuo procedimento è sbagliato.
    Fammi sapere in che modo hai scritto il file.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    6
    il file non è binario ha questi dati al suo interno:
    3 6
    3
    1
    2
    2 1
    1 2
    1 3
    2 3
    2 1
    3 1
    messi tutti in fila cosi come sono

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Allora sono caratteri, nel tuo caso non ci sono numeri a due cifre per cui ogni stringa numerica è composta da un solo carattere.
    In codice ASCII il carattere di caporiga ha valore 10, e il carattere spazio ha valore 32.
    Il motivo per cui ti stampa solo una sequenza di 32 e 10 è che usi due volte la fgetc qua:

    codice:
    while ((empy=fgetc(fp) )!=EOF) { // ad ogni iterazione leggi un carattere
    empy=fgetc(fp);       // leggi nuovamente il carattere
    printf ("%d\n", empy);
    
                        start[i]=empy;
                        i++;
                        }
    
    fclose(fp);
                          
      system("PAUSE");	
      return 0;
    }
    Per cui ti legge solo i caratteri in posizioni pari, che nel tuo caso sono lo spazio e il caporiga.
    Devi cambiare approccio: innanzitutto considera il caso generico in cui un numero potrebbe essere composto da più caratteri.
    Leggi il file mettendo progressivamente i caratteri in una stringa, finché non incontri uno spazio o un caporiga.Quando incontri il caporiga significa che la stringa numerica è terminata, e converti la stringa in numero con atof.

    codice:
    int main(int argc, char *argv[])
    {
      int start[100];
      int nv, ns;
      int winner;
      int app;
      int i;
      int empy;
      
      FILE *fp;
      fp= fopen("input.txt","r");
      i=0;
    while ((empy=fgetc(fp) )!=EOF) 
    {
        start[i++]=empy;
        if(start[i-1]== ' ' || start[i-1]=='\n')
        {
            start[i-1]=0;
            printf("%s\n",start);
            i=0;
        }
    }
    fclose(fp);
                          
      system("PAUSE");	
      return 0;
    }
    In questo caso siccome era sufficiente stampare il numero non è stato necessario usare la atof, però se ti occorre tenere traccia del numero in una variabile di tipo int allora devi usare la atof.
    Ti consiglio di guardare a questo codice come ad un esempio, non copiarlo ed incollarlo.Ma prova a ragionarci e sviluppa tu una tua soluzione.

  8. #8
    La cosa più immediata sarebbe usare semplicemente la fscanf, di cui trovi facilmente la documentazione e che è presentata sul capitolo sui file di qualunque libro di C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    6
    ok adesso ci provo se non riesco vi faccio sapere.. sono un po impegnato in questi giorni quindi non ho molto tempo libero...

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    6
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int start[100];
      int nv, ns;
      int winner;
      int app;
      int i;
      int empy;
      
      FILE *fp;
      fp= fopen("input.txt","r");
      i=0;
                         
                         fscanf(fp,"%d %d",&nv, &ns);
    
    printf("%d %d\n", nv, ns);
    
    for(i=0;i<nv;i++){
                      
                      fscanf(fp,"%d", &start[i]);
                      
                      printf("%d\n",start[i]);
                      }
            
    
    /* ciclo errato          
    for(i=0;i<ns;i++){
                      //i++;  anche se aumento il contatore mi escono risultati sbagliati numeri troppo lunghi a 5 cifre
                      fscanf(fp,"%d%d", &start[i+nv], &start[i+nv+1]);
                      printf("%d ",start[i]);
                      
                      printf("%d\n",start[i+1]);
                      }
    */
    //ciclo esatto
    for(i=0;i<ns;i++){
               
                      fscanf(fp,"%d%d", &app, &app1);
                      printf("%d ",app);
                      
                      printf("%d\n",app1);
                      }
    
    fclose(fp);
                          
      system("PAUSE");	
      return 0;
    }
    l'ho rifatto a mado mio con gli fscanf, però nell'ultimo ciclo non mi prende i valori giusti.. se invece utilizza delle valiabili mi da i valori esatti.. anche se sono riuscito a fare ciò che volevo vorrei sapere perchè con il vettore mi escono risultati sbagliati e con le variabili no..
    inoltre con gli ultimi 6 valori avrei dovuto modificare i 3 valori messi prima scambiandoli di posto... ed ho fatto cosi
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int start[100];
      int nv, ns;
      int winner;
      int app;
      int i;
      int empy;
      int app1;
      int app2;
      FILE *fp;
      fp= fopen("input.txt","r");
      i=0;
                         
                         fscanf(fp,"%d %d",&nv, &ns);
    
    printf("%d %d\n", nv, ns);
    
    for(i=0;i<nv;i++){
                      
                      fscanf(fp,"%d", &start[i]);
                      
                      printf("%d\n",start[i]);
                      }
                    int i1, i2;  
    for(i=0;i<ns;i++){
                      fscanf(fp,"%d%d", &app, &app1);
                      
                      for(i1=0;i<nv;i1++){
                              
                              if(start[i1]==app){
                                                
                                                for(i2=0;i<nv;i2++){
                                                        if(start[i2]==app1){
                                                                            
                                                                            
                                                                            start[i2]=app;
                                                                            start[i1]=app1;
                                                                            
                                                                            goto done;
                                                                            
                                                                            }
                                                                            }
                                                                            }
                                                                            }
                                                done:
                                                
                      printf("%d ",app);
                      
                      printf("%d\n",app1);
                      }
    
    printf("\n\n%d",start[0]);
    fclose(fp);
                          
      system("PAUSE");	
      return 0;
    }
    nello spazio start[0] seguendo tutti gli scambi si dovrebbe trovare il 2, però mi esce 1.

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.