Ja bym spróbował zrobić to w ten sposób: przed zapisaniem wartości tekstowej zapisujesz długość tekstu. Następnie przy wczytywaniu już wiesz jaką długość ma tekst.
Tutaj masz przykład:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char *string;
} node;
node *node_new()
{
node *self = malloc(sizeof(node));
if (!self) {
// error
return NULL;
}
self->string = NULL;
return self;
}
void node_set(node *self, const char *value)
{
assert(self != NULL);
self->string = malloc(strlen(value) + 1); // tutaj także wypada sprawdzić błąd
strcpy(self->string, value);
}
void node_free(node *self)
{
if (self->string) {
free(self->string);
}
free(self);
}
void w_node(node *entry, const char *file) {
FILE *f = fopen(file, "w");
if (!f) {
// error
return;
}
assert(entry->string != NULL); // dodać kod, który obsłuży pustą zmienną tekstową
int size = strlen(entry->string);
fwrite(&size, sizeof(int), 1, f);
fwrite(entry->string, sizeof(char), size, f);
fclose(f);
}
node *r_node(const char *file) {
FILE *f = fopen(file, "r");
if (!f) {
// error
return NULL;
}
int size = 0;
fread(&size, sizeof(int), 1, f);
assert(size != 0); // to też warto obsłużyć
char *buffer = malloc(size + 1);
if (!buffer) {
// error
return NULL;
}
fread(buffer, sizeof(char), size, f);
buffer[size + 1] = 0;
node *entry = node_new();
if (!entry) {
// error
return NULL;
}
// buffer jest podwójnie kopiowany, wolno to zoptymalizować
node_set(entry, buffer);
free(buffer);
return entry;
}
int main(int argc, char **argv)
{
FILE *f = fopen("test.txt", "r");
if (!f) {
// error
return 1;
}
node *entry = node_new();
if (!entry) {
// error
return 1;
}
node_set(entry, "test");
w_node(entry, "test.txt");
node_free(entry);
node *loaded_entry = r_node("test.txt");
printf("%s\n", loaded_entry->string);
node_free(loaded_entry);
fclose(f);
return 0;
}