Tôi đang cố gắng lưu cấu trúc có chuỗi char * vào tệp.Lưu cấu trúc C với chuỗi char * vào một tệp
struct d_object {
int flags;
int time;
int offset;
char *filename;
};
Vấn đề là khi làm điều đó, tôi rõ ràng sẽ chỉ lưu địa chỉ của con trỏ đó chứ không phải chuỗi. Vì vậy, những gì tôi đã làm chỉ đơn giản là sử dụng một mảng ký tự và tôi buộc phải thiết lập kích thước tối đa của chuỗi. Điều này hoạt động tốt, tuy nhiên tôi đã tự hỏi nếu có anyway của lưu trữ các struct với một char * (mà tôi malloc tại một số điểm) trong một tập tin và sau đó lấy nó. Tôi có thể lưu chuỗi và cấu trúc riêng biệt và sau đó lấy chúng nhưng nó là một mớ hỗn độn. Sẽ tốt hơn nếu tôi có thể tải và lưu toàn bộ cấu trúc (phần trên) vào tệp. Cảm ơn!
Mã với mảng char là dưới đây:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
struct d_object {
int flags;
int time;
int offset;
char filename[255];
};
int main(int argc, char **argv) {
struct d_object fcb;
fcb.flags=5;
fcb.time=100000;
fcb.offset=220;
strncpy(fcb.filename,"myfile",255);
int fd=open("testfile",O_RDWR);
write(fd,&fcb,sizeof(fcb));
close(fd);
int fd2 = open("testfile",O_RDONLY);
struct d_object new_fcb;
read(fd2,&new_fcb,sizeof(new_fcb));
printf("read from file testfile: %s\n",new_fcb.filename);
return 0;
}
P.S .: tôi không sử dụng các chức năng STREAM đơn giản vì đây là thực sự có nghĩa là để được chạy trên một hệ điều hành nhúng mà không có họ. Tôi vừa điều chỉnh mã cho * BSD/Linux để nó có ý nghĩa hơn khi đặt câu hỏi.
Cách bạn đang sử dụng fread là rất sai. Bạn không khai báo một bộ đệm char và đọc nó, sau đó trỏ một con trỏ struct vào nó. Đơn giản chỉ cần khai báo một struct và chuyển con trỏ tới cấu trúc đó để fread. Cách bạn đã thực hiện nó không phải là hợp lệ C và có khả năng gặp sự cố trên các kiến trúc RISC với các yêu cầu liên kết chặt chẽ. –
ok, cảm ơn vì điều đó. Tuy nhiên đó không phải là vấn đề chính tại thời điểm này. – theprole