Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [C] lettura file pseudo binario

    ciao,
    chiedo lumi anche qui in merito al riempimento di una struttura dati ed al funzionamento della fread().
    Ho un certo file da leggere su disco e per riempire automaticamente una struttura dati scrivo:

    codice:
    struct customer
    {
       char header[2];
       char fname[2];
       char lname[2];
    };
    
    struct customer input;

    dopo aver aperto il file, si di tipo ascii che binario scrivo:

    codice:
    fread (&input, sizeof(struct customer), 1, infile);
    printf ("1=%d\n2=%d\n3=%d\n",
               strlen(input.header),strlen(input.fname),strlen(input.lname));
    domanda: come mai le lunghezze dei caratteri dei singoli campi non sono di 2 byte ma superiori?
    Mi aspettavo che la fread() attraverso il sizeof() leggesse al più 6 caratteri ma coosì non è.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Guarda che la strlen opera su stringhe terminate da null. Se leggi due soli caratteri per campo, considerando il terminatore, ognuna sarà al massimo lunga 1. Mi sa che stai sbagliando qualcosa ... (che poi che vuol dure pseudo binario?)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    pseudo binario significa che il file che devo leggere è composto da un header con caratteri non stampabili e da un certo punto in poi è in formato ascii.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh, dato che non esiste, diciamo pure che usi una lettura binaria.


    Comunque resta vero quello che ti ho detto, se la testata equivale a quella struttura. Altrimenti metti a disposizione il file dati per controllare meglio.

    A me sembra strano che siano previsti solo 2 caratteri per un campo che su chiama fname.
    Ultima modifica di oregon; 01-02-2018 a 08:48
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Beh, dato che non esiste, diciamo pure che usi una lettura binaria.


    Comunque resta vero quello che ti ho detto, se la testata equivale a quella struttura. Altrimenti metti a disposizione il file dati per controllare meglio.

    l'idea di fondo è riuscire a popolare una struttura in modo che, se il file viene modificato, è sufficiente modificare la struttura per sistemare il programma.

    struct customer
    {
    char header[2];
    char fname[2];
    char lname[2];
    };

    quindi se la strlen() va fino allo '\0', anche la printf() che segue il medesimo ragionamento dello '\0', vuol dire che l'output che osservo è fatto anche di caratteri non appartenenti a quelli letti dal file cioè, sporcizia in memoria.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mi dispiace ma non si riesce a capire la questione. Certo che il resto é in memoria, ma ti servono due caratteri per campo o no?


    A questo punto non capisco se il file ce l'hai già o lo vuoi creare. E se esiste, quali sono i dati nella struttura (che deve essere ben precisa).
    Ultima modifica di oregon; 01-02-2018 a 09:32
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    il numero di caratteri non è vincolante. Se scrivo:

    struct customer
    {
    char header[2];
    char fname[2];
    char lname[2];
    };

    fread (&input, sizeof(struct customer), 1, infile);

    ogni campo sarà di 2 byte.


    Ma se modifico il file, riadatto la struttura

    struct customer
    {
    char header[20];
    char fname[15];
    char lname[20];
    char nuovo[12];
    };

    fread (&input, sizeof(struct customer), 1, infile);

    ogni campo sarà di n byte con aggiunta di un nuovo campo.


    In definitiva, il programma non deve soddisfare un file ben preciso, ma deve essere in grado di adattarsi usando poche funzioni del C. Siccome di file che io chiamo pseudo binari ne ho n e sono tutti diversi, dovrei adattare ogni volta il programma al file, magari riempiendo un buffer e troncandolo ogni volta per ottenere ciò che voglio, sarebbe un lavoro immane.
    Ultima modifica di misterx; 01-02-2018 a 09:49

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Va beh, mi dispiace ma ci rinuncio.

    Non capisco cosa tu voglia fare nè, a questo punto, cosa c'entrino le strutture.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Va beh, mi dispiace ma ci rinuncio.

    Non capisco cosa tu voglia fare nè, a questo punto, cosa c'entrino le strutture.

    peccato.
    Se tu avessi a disposizione un file di cui non ne conosci la struttura in quanto fatto da altri ed è parte in binario e in parte in formato ascii, come lo tratteresti?
    Come estrarresti i dati al suo interno?

    La struttura era una idea in quanto in un certo senso, riassume com'è fatto il file: ha un header, un campo che descrive questo, un altro che descrive quell'altro etc..
    Non mi sembra di aver detto chissà che.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da misterx Visualizza il messaggio
    Se tu avessi a disposizione un file di cui non ne conosci la struttura in quanto fatto da altri ed è parte in binario e in parte in formato ascii, come lo tratteresti?
    Questo NON l'hai mai detto. Fino ad ora sembrava che il file tu lo conoscessi bene.
    Invece vuoi fare il REVERSE ENGINEERING della struttura del file (che è comunque binario, anche se contiene parti di stringhe in ASCII).

    E dirlo prima?

    La struttura era una idea in quanto in un certo senso, riassume com'è fatto il file: ha un header, un campo che descrive questo, un altro che descrive quell'altro etc..
    Il file ha un header? E che ne sai, dato che non conosci il file? Potrebbe anche non averne.
    A meno che tu non abbia informazioni precise a riguardo.

    Non mi sembra di aver detto chissà che.
    Beh, se il file non lo conosci, affermi che abbia una struttura al suo inizio. Ed è un'affermazione quanto meno azzardata.

    Capire come è fatto il file non è banale.

    Dovrai studiarlo con un editor binario per cercare di capire il suo contenuto (e non è detto che tu ci riesca, pensa a file complessi come un doc di Word). Ripeto, è un lavoro tutt'altro che semplice.
    Ultima modifica di oregon; 01-02-2018 a 10:49
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.