Abaixo pequenas correções que pude identificar, porém acho que do jeito que está irá gravar somente uma struct e não todas as relacionadas. O tamanho gravado ‘sizeof’ só atende uma e os pointers dos relacionados esquerda e direita, sem seu conteúdo.
void stexto () {
FILE *arquivo_texto;
arquivo_texto = fopen ("arquivo_texto.txt", "a"); //creio que aqui seja somente a de 'append', o modo txt é o padrão já
if (arquivo_texto == NULL) {
printf("Erro ao abrir o arquivo.\n");
exit(1);
}
//%s string //%d integer
fprintf(arquivo_texto, "%d %s %2f\n", raiz->cod, raiz->nome, raiz->preco); // '->' e não '.', pois raiz é um pointer
fclose(arquivo_texto);
}
void sbinario () { // sem a struct...
FILE *fp;
fp = fopen ("Binario", "ab"); //correto, ab para append e binario
if (fp == NULL) {
printf ("Erro ao abrir o arquivo.\n");
exit(1);
}
else {
//if (fp != NULL) {}
printf ("Arquivo Binario criado com sucesso.\n");
fseek(fp, 0, SEEK_SET);
fwrite(&raiz, sizeof(struct PERFUME), 1, fp);
fclose (fp);
}
}
Ah, o retorno do ‘fwrite’ é o tamanho do que foi gravado, então você pode utilizar como teste para saber se realmente houve sucesso na gravação.
Não ajudou muito mas já é um começo,
boa sorte!