2012-12-07 29 views
6

tôi có chương trình sau đây:sử dụng fwrite() để viết một struct vào một tập tin

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

Những gì tôi đang làm là tạo ra hồ sơ từ người dùng nhập vào, và sau đó lưu trữ những "kỷ lục" vào một tập tin. Tuy nhiên, khi tôi sử dụng fwrite(), tệp được tạo ra có rất nhiều ký tự lạ được viết trong đó, thay vì chỉ đơn giản là có mỗi bản ghi với khóa và dữ liệu của nó. Bất cứ ai có thể cho tôi biết lý do tại sao nó viết tất cả các nhân vật kỳ lạ?

+0

vì lỗi của tôi, tôi đã sửa tiêu đề. – me45

Trả lời

4

Một số lý do:

  1. Khi bạn sử dụng scanf, nó chuyển một hình dạng con người có thể đọc được (% d) vào một cái gì đó máy tính sử dụng trực tiếp (int). Sau đó, bạn viết biểu mẫu có thể đọc được trên máy tính vào tệp. Bây giờ, khi bạn xem tệp, bạn KHÔNG sử dụng biểu mẫu nghịch đảo từ máy tính đến người có thể đọc được nhưng ở mức độ thấp hơn nhiều. Điều này sẽ cho bạn một cái gì đó có vẻ sai.
  2. Bạn đang viết toàn bộ x.data mặc dù bạn có thể đã đọc một phần dữ liệu vào nó (ví dụ, đọc một chuỗi có độ dài 10). Phần còn lại của x.data là "uninitialized" và chứa bất cứ thứ gì còn lại trong bộ nhớ khi hàm main() được gọi.
0

Nó lưu trữ dữ liệu dưới dạng bản ghi nhị phân, chứ không phải văn bản thuần túy.

Bạn sẽ không thể xem bằng notepad.

Để xem bản ghi, bạn sẽ phải viết một chương trình khác đọc bản ghi từ tệp vào cùng một cấu trúc.

1

Tôi cũng có cùng một loại vấn đề trong khi đọc cấu trúc khối tham số BIOS từ một ảnh đĩa mềm. Tôi đã giải quyết nó bằng cách sử dụng chỉ thị #pragma pack(1). Mã mẫu bên dưới:

#pragma pack(1) 
struct bpb 
{ 
    unsigned char jmpinstruction[3]; 
    unsigned char oem[8]; 
    short bytespersector; 
    .... 
}; 
#pragma pack() 
Các vấn đề liên quan