2012-12-07 33 views
6

Ho il seguente programma:usando fwrite() per scrivere una struttura in un file

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXLEN 100 

typedef struct {int key; char data[MAXLEN];} record; 

main(int argc, char *argv[]) 
{ 
    int n, i; 
    record x; 
    FILE *fp; 
    fp = fopen(argv[1], "w+"); 
    printf("How many records will be entered? \n"); 
    scanf("%d", &n); 
    for (i=0; i<n; i++) 
    { 
     printf("Enter record: \n"); 
     scanf("%d", &x.key); 
     scanf("%s", &x.data); 
     fwrite(&x, sizeof(record), 1, fp); 
    } 
} 

Quello che sto facendo è la creazione di record da input dell'utente, e quindi la memorizzazione di questi "record" in un file. Tuttavia, quando utilizzo fwrite(), il file che viene creato ha molti caratteri strani scritti in esso, invece di avere semplicemente ogni record con la sua chiave e i suoi dati. Qualcuno può dirmi perché sta scrivendo tutti questi strani personaggi?

+0

sì, il mio errore, ho corretto il titolo. – me45

risposta

4

diversi motivi:

  1. Quando si usa scanf, si traduce una forma leggibile (% d) in qualcosa che il computer utilizza direttamente (int). Quindi scrivi il modulo leggibile dal computer in un file. Ora, quando si visualizza il file, NON si sta utilizzando il modulo inverso computer-to-readable umano ma qualcosa di molto più basso livello. Questo ti darà qualcosa che sembra sbagliato.
  2. Si sta scrivendo l'intero x.data anche se è possibile che abbiate letto dati parziali (ad esempio, leggendo una stringa che è la lunghezza 10). Il resto di x.data è "non inizializzato" e contiene tutto ciò che è rimasto in memoria quando è stato chiamato main().
0

Memorizza i dati come record binari, non testo normale.

Non è possibile visualizzarlo utilizzando il blocco note.

Per visualizzare i record, è necessario scrivere un altro programma che legge i record dal file nella stessa struttura.

1

Ho anche avuto lo stesso tipo di problema durante la lettura della struttura del blocco dei parametri del BIOS da un'immagine del disco floppy. L'ho risolto utilizzando la direttiva #pragma pack(1). Il codice di esempio è il seguente:

#pragma pack(1) 
struct bpb 
{ 
    unsigned char jmpinstruction[3]; 
    unsigned char oem[8]; 
    short bytespersector; 
    .... 
}; 
#pragma pack()