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

    [C] Esercizio su file e somma di caratteri ASCII

    Salve , sto cercando di risolvere questo esercizio, ma mi sa proprio di avere delle lacune:

    Scrivere in C una funzione void fun(FILE *f1, FILE *f2) che prende come parametri due puntatori a file. f1 `e un file di caratteri e f2 un file di interi. f1 contiene sequenze di caratteri, magari parole senza senso, separate da uno o pi`u spazi. Ogni intero contenuto in f2 dovrebbe corrispondere alla somma delle codifiche ASCII dei caratteri in f1. Chiaramente,il primo intero corrisponde alla prima sequenza di caratteri, il secondo alla seconda e cos`ı fino alla fine. Il metodo deve restituire un intero uguale a: −1 se esistono pi` u sequenze di caratteri in f1 che numeri in f2 o viceversa, 0, se un numero presente in f2 non `e uguale alla somma delle codifiche dei caratteri della sequenza corrispondente, n, ovvero numero di sequenze/interi letti,sei due file sono costruiti in modo corretto.

    Ho provato così:

    codice:
    #include <stdio.h>
    #include <string.h>
    #define MAX 30
    
    int  fun(FILE *f1, FILE *f2){
        rewind(f1);
        rewind(f2);
        char r1,v1;
        int t=0,r2,k,v2;
         
     do{
        r2 = fread(&v2, sizeof(int), 1, f2);
        while(v1=getc(f1)!=' '){
           t+=v1;
        }
        if (r1==0||r2==0) return -1;
        if(v2==t) k++;
        if(v2!=t) return 0;;
       }while(r1>0||r2>0);
       
      return k;
    }
    int main(){
     FILE *f1,*f2;
     if((f1=fopen("car.txt","r"))==NULL) printf("errore\n");
     if((f2=fopen("num.txt","r"))==NULL) printf("errore");
     printf("%d",fun(f1,f2));
    
    
     return 0;
    }
    Ultima modifica di LeleFT; 16-02-2018 a 18:47 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Vedo che i due file f1 e f2, sono file di testo, e tu usi fread() "che si usa per i file binari" , per estrarre numeri interi da un file di testo. Penso che se i numeri interi sono salvati sotto forma di stringa, dovresti usare la fscanf() per recuperarli.
    Tecnologia

  3. #3
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Vedo che i due file f1 e f2, sono file di testo, e tu usi fread() "che si usa per i file binari" , per estrarre numeri interi da un file di testo. Penso che se i numeri interi sono salvati sotto forma di stringa, dovresti usare la fscanf() per recuperarli.
    Allora, ho provato a sostituire la fread con fscanf(f2,"%d",&r2); (con le dovute modifiche) però ottengo lo stesso risultato... Ho anche cercato di cambiare File con un .dat ma niente.

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Hai modificato il codice che non mostri, quindi non si può dire nulla.

    Nel primo codice "quello che hai postato", noto un errore logico, usi la variabile t, per sommare il valore ascii della sequenza di caratteri, MA POI non la riporti a zero, quindi nei confronti successivi il confronto sara sempre false.



    codice:
    while(v1=getc(f1)!=' '){
           t+=v1; // Sommo il valore ascii della stringa
        }
        if(r1==0||r2==0)return-1;
        if(v2==t) k++; // faccio il confronto
        if(v2!=t)return0;
        t=0; // riporto a zero per la stringa sucessiva
    Tecnologia

  5. #5
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Hai modificato il codice che non mostri, quindi non si può dire nulla.

    Nel primo codice "quello che hai postato", noto un errore logico, usi la variabile t, per sommare il valore ascii della sequenza di caratteri, MA POI non la riporti a zero, quindi nei confronti successivi il confronto sara sempre false.



    codice:
    while(v1=getc(f1)!=' '){
           t+=v1; // Sommo il valore ascii della stringa
        }
        if(r1==0||r2==0)return-1;
        if(v2==t) k++; // faccio il confronto
        if(v2!=t)return0;
        t=0; // riporto a zero per la stringa sucessiva
    Perdonami, allego il resto:
    codice:
    codice:
     do{
        fscanf(f2,"%d",&r2);  //r2 = fread(&v2, sizeof(int), 1, f2); 
        while(v1=getc(f1)!=' '){
           t+=v1;
        }
        if (r1==0||r2==0) return -1;
        if(r2==t) k++;
        if(r2!=t) return 0;
        t=0;
       }while(r1>0||r2>0);
       
      return k;
    }
    Ho corretto quell'imprecisione , però credo di aver usato la fscanf in modo scorretto.
    Ultima modifica di francesco.1; 17-02-2018 a 12:23

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Sia nella prima versione che nell'ultima, non rispondi a tutte le richieste della traccia.
    Questo if(r1==0||r2==0)return-1;, in tutte e due le versioni non fa quello che ti aspetti.
    A mio avviso, dovresti scorrere i due file fino alla fine, in f1 conti le parole mentre in f2 conti gli interi, e li fai il confronto e rispondi alla prima richiesta della traccia.

    poi riposizioni i due file a inizio file, e procedi come ora
    Tecnologia

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.