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

    Gestione File C in XCode

    Sto provando a far girare qualche programma in C, che sto studiando per l'università. Fino ad ora tutto ok, vengo dal PHP e sulle basi (eccetto questo) non ci sono stati intoppi.
    Con i file invece è una gran rogna.. nel senso che non riesco veramente a farci molto.
    Dopo aver finalmente capito in che cartella andavano piazzati i file da far leggere in fase di debug, mi ritrovo con questo programma di prova che va in errore (le librerie sono così numerose perché il programma iniziale era un po' più corposo.. poi a furia di ricevere risultati sbagliati l'ho ridotto per capire dove potrebbe essere l'errore.. con scarsi risultati):

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct {
    	int Id;
    	char Tipo[16];
    	int Altezza;
    	int Larghezza;
    	int Prezzo;
    	char Colore[15];
    } Mat;
    
    int main () {
    	Mat m;
    	FILE *file;
    	if ((file = fopen("materiali.txt", "r"))==NULL) { printf("Impossibile aprire il file"); }
    	fscanf(file, "%d ", &m.Id);
    	fscanf(file, "%16s ", &m.Tipo);
    	fscanf(file, "%d ", &m.Altezza);
    	fscanf(file, "%d ", &m.Larghezza);
    	fscanf(file, "%d ", &m.Prezzo);
    	fscanf(file, "%15s", &m.Colore);
    	fclose(file);
    	printf("%d %s %d %d %d %s", m.Id, m.Tipo, m.Altezza, m.Larghezza, m.Prezzo, m.Colore);
    	getchar();
    }
    Il file in questione è molto semplicemente composto in questo modo:

    codice:
    1 Pavimento 3 4 20 Fucsia
    Se provo il programma in debug, mi stampa questo:

    codice:
    0 \377\3761 10 -1880875008 -1073744480
    Grazie Mille!
    Paolo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Togli tutti gli spazi nelle scanf ... ovvero non

    "%d "

    ma

    "%d"

    e così via
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ho provato anche così ma non gira comunque (anzi, originariamente era così). Non capisco proprio cosa possa essere

  4. #4
    Ho provato mettendo il sorgente in Dev-c++ e nessun errore! credo che tu sbagli nella fopen... dove hai piazzato il file materiali.txt? perchè non metti il pathname completo nella fopen? eviti cosi errori nell' aggancio del file! il codice va bene

  5. #5
    Anche con il pathname completo restituisce gli stessi risultati.. Non comprendo veramente..

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Modifica il codice di apertura del file con:

    codice:
        if ((file = fopen("materiali.txt", "r")) == NULL) {
            perror("impossibile aprire il file");
            exit(-1);
        }
    in questo modo, in caso di errore nell'apertura del file:

    1) il programma termina invece di continuare, evitando quindi di crashare per le successive operazioni di lettura da file che non potrebbero aver luogo;
    2) ottieni un messaggio di errore che può darti qualche informazione utile per il debug.

    Se l'apertura va a buon fine, l'errore è da ricercare probabilmente nel file e/o nel suo contenuto: sicuro di aprire il file giusto con i dati giusti con la formattazione giusta?
    every day above ground is a good one

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Questo dipende da come hai scritto il file.Se l' hai scritto in binario o usando la fprintf mettendo i giusti formati, allora te lo legge correttamente.Se invece l' hai scritto usando il blocco note allora probabilmente quei numeri te li ha scritti come se fossero dei caratteri, per cui se leggi con %d leggi il valore dei primi 4 bytes (sempre che la dimensione sulla tua macchina sia questa), che però comprendono i primi 4 caratteri.
    Per cui leggi tutto con la fgets e poi dividi la stringa in token usando lo spazio come separatore, e ricomponi le singole parole e numeri (atoi per la conversione da stringa a numero).

  8. #8
    Guarda, io ho salvato dal blocco note un file "materiali.txt" come dicevi tu, con salvato ciò che tu dici di avere nel suddetto file. blocco note, di standard, salva in ASCII, quindi per prima cosa assicurati che anche il tuo file sia salvato in questa codifica, sennò "sballano" le fscanf... ripeto, il codice va bene, il problema deve essere nel file! ps: anch' io, se non andava la fopen, ho ricevuto numeri e parole incomprensibili dalle fscanf, come è "giusto" che sia visto la sorgente da cui poi prende quelle informazioni.

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.