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

    C fwrite int, strane cose vengono scritte

    Salve ragazzi, devo aver commesso qualche errore alle righe in cui scrivo nel file poichè vengono scritte delle schifezze incomprensibili.
    Potete darci un occhiata?? Mi è venuto il sospetto fosse il fwrite scritto male ma ho cercato in giro(http://stackoverflow.com/questions/7...nary-file-in-c) e sembrerebbe corretto... Ho provato a togliere fputc() e gli fflush() ma niente.
    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[]) {
    	if( argc != 2 ) {
    		printf( "Inserire 1 argomenti!\n" );
    		return 0;
    	}
    	FILE* f = fopen( argv[1], "wb" );
    	if( f == NULL ) printf( "Errore nell'apertura del file \"%s\"\n", argv[1] );
    	
    	fseek(f, 0, SEEK_SET);
    
    	int count = 0;
        for( int np = 2; count != 1000000 ; np++ ) {
    		int a = 2;
    		while (a*a < np && (np % a) != 0) a++;
    		if (np == 2 || (np % a) != 0) {
    			printf( "%d\n", np );
    			fwrite(&np, sizeof(int), 1, f);
    			fflush(f);
    			fputc('\n', f);
    			fflush(f);
    			count++;
    		}
    	}	
    
    	fclose(f);
    	return 0;
    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Prima cosa: perchè se c'è un errore nell' apertura del file non esci dal programma?
    Poi a che serve quella fseek dopo il secondo if?

  3. #3
    Mi sono dimenticato di mettere l'uscita xD
    Non so, il proff l'ha messa in classe, forse mi ricordo male.

  4. #4
    Ahhh è perche quelli li scrive in binario e non posso leggerli con un notepad... xD

    Comunque
    Il programma deve fare questo:
    Scrivere un programma che prende come argomento il nome di un file e se non esiste lo crea e vi scrive il primo milione di numeri primi (in ordine crescente). Poi permette all'utente di inserire interi k e per ogni k stampa il k-esimo numero primo, leggendolo dal file. Il file è binario e i numeri primi sono memorizzati come int. Ad esempio, se l'utente inserisce k = 1 il programma stampa 2, se k = 1000 il programma stampa 7919 e se k = 1000000 il programma stampa 15485863 (il milionesimo numero primo).
    Mi manca da implementare per bene la parte in cui l'utente inserisce k.
    Dato che in precedenza quando ho scritto i numeri primi, ho messo subito dopo il numero un '\n'
    Quel carattere new line lo sfrutto cosi:
    L'utente inserisce il k-esimo, faccio un ciclo che conta all'indietro k, e con fgetc() quando incontro '\n' diminuisco di 1 k. Quando k sarà arrivato ad 1, il numero successivo sarà proprio il k-esimo numero primo.
    Spero di essermi spiegato.
    La parte di codice che vi ho descritto va dalla riga 32 alla 48. Potete darci un occhiata?? Magari non ditemi subito la soluzione fatemici arrivare piano piano xD
    Vi ringrazio tantissimo per il supporto che mi date ragazzi :-*

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Se tu scrivi caratteri su un file di testo formato plain text, dovresti essere in grado di leggerli quando lo apri.
    Il problema è che con la fwrite scrivi in binario un intero, non lo scrivi con lo stesso formato di un carattere, risolvi con:

    codice:
    fprintf(f,"%d",np);
    Al posto della fwrite.

    PS:Non è l' approcio giusto usare cose a caso di cui non si conosce il significato.
    Quella fseek si posiziona all' inizio del file, ma tu ci sei già all' inizio del file.

  6. #6
    Ti ringrazio del supporto, grazie davvero.
    Ho deciso di guardare la soluzione, è da stamattina le 7 che sto su questi programmi e vorrei andare a letto...
    Il seguente è la soluzione del professore. L'ho letta e l'ho capita. Unico problema è che non funziona xD
    Se li chiedo di stamparmi a video il milionesimo numero, fa qualcos'altro, ed è lo stesso con altri numeri. Riesci ad individuare l'errore??
    codice:
    #include <stdio.h>
    
    int prime(long long n) {   //Ritorna vero se e solo se n è un numero primo
        long long k = 2;
        while (k * k < n && (n % k) != 0) k++;
        return (k >= n || (n % k) != 0);
    }
    
    void writeprimetable(char *fname, int np) {
        FILE *f = fopen(fname, "wb");
        if (f == NULL) return;
        long n = 2, count = 0;
        while (count < np) {
            if (prime(n)) {
                fwrite(&n, sizeof(long), 1, f);
                count++;
            }
            n++;
        }
        fclose(f);
    }
    
    #define NUM_PRIMES     1000000L
    
    int main(int argc, char *argv[]) {
        if (argc != 2) return 0;
        FILE *f = fopen(argv[1], "rb");   //Apre il file con la tabella
        if (f == NULL) {                  //Se il file non esiste lo crea
            printf("Elaborazione tabella...\n");
            writeprimetable(argv[1], NUM_PRIMES);
            printf("OK\n");
            f = fopen(argv[1], "rb");
        }
        if (f == NULL) return 0;
        while (1) {
            long k, p;
            printf("Numero d'ordine del numero primo (1 - %ld), 0 per terminare: ",
                    NUM_PRIMES);
            scanf("%ld", &k);
            if (k < 1 || k > NUM_PRIMES) break;
            fseek(f, (k - 1)*sizeof(long), SEEK_SET);
            fread(&p, sizeof(long), 1, f);
            printf("Il %ld-esimo numero primo e' %ld\n", k, p);
        }
        return 0;
    }

  7. #7
    Scusate il doppio post. Aggiungo un altra richiesta a quella sopra:
    Ramy89, hai detto che potrei usare fprintf per ovviare al problema dell'illegibilità. Ma se l'esercizio mi chiede esplicitamente di scrivere un programma che generi un file ad accesso casuale(o binario) posso lostesso usare fprintf e fscanf o devo er forza usare fread e fwrite?

    grazie ancora

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non lo so, non è chiara la consegna.
    Comunque usando la fprintf ha funzionato?

  9. #9
    Allora, stamattina a mente fresca ho rifatto il programma, funziona sempre, dal primo al milionesimo numero senza errori. Sia con fread/fwrite che con fprintf/fscanf.
    (rotfl)(momento di gloria per me che l'ho fatto giusto ed il proff che ha sbagliato) (rotfl)
    codice:
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
    	if( argc != 2 ) {
    		printf( "Inserire 1 argomento!\n" );
    		return 0;
    	}
    	FILE* f = fopen( argv[1], "w+b" );
    	if( f == NULL ) {
    		printf( "Errore nell'apertura del file \"%s\"\n", argv[1] );
    		return 0;
    	}
    	int limit;
    	printf( "Quanti numeri primi si vogliono scrivere?\n? ");
    	scanf( "%d", &limit );
    	int np;
    	int count = 1;
        for( np = 2; count <= limit ; np++ ) {
    		int a = 2;
    		while (a*a < np && (np % a) != 0) a++;
    		if (np == 2 || (np % a) != 0) {
    			fwrite(&np, sizeof(int), 1, f);
    			/* fprintf(f, "%d\n", np); */
    			fflush(f);
    			count++;
    		}
    	}
    	
    	int k = 1;
    	printf("\nk - Restituisce k-esimo\n0 - Termina programma\n? " );
    	scanf("%d", &k);
    	while(k) {
    		fseek(f, 0, SEEK_SET);
    		count = 1;
    		
    		while(count < k) {
    			count++;
    			fseek(f, sizeof(int), SEEK_CUR);
    		}
    		fread(&np, sizeof(int), 1, f);
    		
    		/* while(count < k) { 
    			if( fgetc(f) == '\n' )
    				count++;
    		}
    		fscanf(f, "%d", &np); */
    		
    		fflush(f);
    		printf( "%d\n", np );
    		
    		printf("\nk - Restituisce k-esimo\n0 - Termina programma\n? " );
    		scanf("%d", &k);
    	}
    	
    	fclose(f);
    	return 0;
    }
    Ti sarei grato se potresti dare un occhiata alle parti in cui scrivo nel file e alle parti in cui leggo e dirmi se ci sono modi un po piu semplici di quelli che ho pensato io, cosi posso facilitarmi la vita in futuro e fare qualcosa di piu leggibile.
    Ti ringrazio tanto.

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.