2012-12-07 51 views
6

mam następujący program:użyciu fwrite(), aby napisać struct do pliku

#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); 
    } 
} 

Co robię jest tworzenie rekordów z danych wprowadzonych przez użytkownika, a następnie przechowywać te „rekordy” do pliku. Jednak, gdy używam fwrite(), tworzony plik ma wiele dziwnych znaków w nim zapisanych, zamiast po prostu mieć każdy rekord z jego kluczem i danymi. Czy ktoś może mi powiedzieć, dlaczego pisze wszystkie te dziwne postacie?

+0

Tak, mój błąd, poprawiłem tytuł. – me45

Odpowiedz

4

kilku powodów:

  1. Przy użyciu scanf, przekłada postaci czytelnej dla człowieka (% d) w coś Komputer wykorzystuje bezpośrednio (int). Następnie zapisujesz formę do odczytu komputerowego do pliku. Teraz, gdy przeglądasz plik, NIE używasz odwrotnej odczytywanej przez komputer postaci, ale coś znacznie niższego. To da ci coś, co wygląda źle.
  2. Zapisujesz całe x.data, nawet jeśli przeczytałeś w nim częściowe dane (np. Czytając ciąg o długości 10). Pozostała część x.data jest "niezainicjowana" i zawiera wszystko, co zostało w pamięci po wywołaniu metody main().
0

Przechowuje dane jako zapisy binarne, a nie zwykły tekst.

Nie będzie można wyświetlić go za pomocą notatnika.

Aby wyświetlić rekordy, trzeba napisać inny program, który odczytuje zapisy z pliku w tej samej strukturze.

1

Mam również ten sam rodzaj problemu podczas odczytu struktury bloku parametrów BIOS z obrazu dyskietki. Rozwiązałem go, używając dyrektywy #pragma pack(1). Przykładowy kod znajduje się poniżej:

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