首先道歉,如果之前已经提出这个问题,或者有一个我看不到的明显的解决方案。我发现了一个similar问题,但我相信我的要求比之前提出的要多一点。
我的结构如下:
typedef struct {
int id;
char *title;
char *body;
} journal_entry;
问:如何在不使用固定长度的情况下编写和加载C(不是C ++)内存指针的内容?
我错误地认为通过将title
或body
写入文件我会最终得到垃圾数据而不是实际存储的信息?我不知道日记帐分录的title
或body
的大小,并且大小可能因条目而异。
我自己的阅读建议我需要分别取消引用指针和fwrite
结构的每个部分。但我不确定如何跟踪数据和结构,而不会让事情变得混乱,特别是对于较大的文件。此外,如果这些不是我打算存储在文件中的唯一项目(例如,我可能希望稍后包含小图像,我不确定如何为方便起见而订购文件结构。
另一个(可能是感知的)问题是我在加载数据时使用malloc
为主体/条目的字符串分配内存我怎么知道在希望时为字符串分配多少内存再次加载条目?我是否需要扩展我的结构以包含int body_len
和int title_len
?
非常感谢指导或建议。
答案 0 :(得分:1)
将内容存储在内存中并不是一个好主意,因为一旦指针所指向的字符串消失,就无法检索它们。从实际的角度来看,一种方法是声明有限长度的字符串(如果你知道你的字符串有长度限制):
typedef struct {
int id;
char title[MAX_TITLE_LEGNTH];
char body[MAX_BODY_LENGTH];
} journal_entry;
如果您需要使用malloc分配标题和正文,则可以使用"标题"存储整个结构长度的元素。将结构写入文件时,可以使用此元素确定需要读取的字节数。
即。写:
FILE* fp = fopen(<your-file-name>,"wb");
size_t size = sizeof(id)+strlen(title)+1+strlen(body)+1;
fwrite(&size, sizeof(size), 1, fp);
fwrite(&id, sizeof(id), 1, fp);
fwrite(title, sizeof(char), strlen(title)+1, fp);
fwrite(body, sizeof(char), strlen(body)+1, fp);
fclose(fp);
阅读(不是特别安全的实施,只是为了提出想法):
FILE* fp = fopen(<your-file-name>,"rb");
size_t size;
int read_bytes = 0;
struct journal_entry je;
fread(&size, sizeof(size), 1, fp);
void* buf = malloc(size);
fread(buf, size, 1, fp);
fclose(fp);
je.id = *((int*)buf); // might break if you wrote your file on OS with different endingness
read_bytes += sizeof(je.id)
je.title = (char*)(buf+read_bytes);
read_bytes += strlen(je.title)+1;
je.body = (char*)(buf+read_bytes);
// other way would be to malloc je.title and je.body and destroy the buf
答案 1 :(得分:0)
在内存中,您可以将字符串存储为数组的指针。但是在磁盘上的文件中,您通常会直接存储数据。一种简单的方法是存储包含大小的uint32_t
,然后存储字符串的实际字节。您还可以在文件中存储以null结尾的字符串,并在读取它们时直接扫描空终止符。第一种方法使得在读取时更容易预先分配所需的缓冲区空间,而无需将数据传递两次。