Various approaches:
1) Use a string.  If FLT_RADIX is 10, use fprintf(outf, " %.*e", DBL_DECIMAL_DIG-1, x), otherwise use fprintf(outf, " %a", x) (Ref).  Use fscanf(inf, "%lf", &x) to read back. ("%la" has same effect)
2) Use a union and assume double format is IEEE double precision binary format, maybe also use defined endian and *nix: htonl()
union d2a {
  double d;
  unsigned char uc[sizeof double];
} u;
u.d = x;
ToNetworkEndian(u.uc);
fwrite(u.uc, 1, sizeof u.uc, outf);
fread(u.uc, 1, sizeof u.uc, inf);
FromNetworkEndian(u.uc);
x = u.d;
3) Write a lot of code to covert compiler's non-standard double to IEEE taking into account: different precision, range, wobbling precision, +/- 0, sub-normals, etc.
Recommend option 1