Apologies for inserting Linux in this discussion, but if one just writes data to the SD card sequentially without any file system, it is rather easy to read in Linux: you can treat the block device as a file, and read it directly. All you need to do is make sure you have the necessary privileges to do so. (I can show a privileged "opener" written in C, though, that simply verifies the first 512 bytes have an acceptable fingerprint, and if so, pass the descriptor (file handle) back to a normal, unprivileged program, so they can treat the entire device as a single file. This is safe, and only requires that you leave the first write block intact, containing a fingerprint that does not match any existing filesystem or partition table structure. (I recommend some initial and final bytes, plus the rest as ASCII text explaining the format.) It can be used in conjunction with e.g. Graphical User Interface written in Python3 and Qt5, for portability.)
Unfortunately, I do not know of any way to do the equivalent in Windows.
For Linux users, it means you do not need the overhead of any file system, as long as you have a way to determine the beginning and ending of data. One method I have used, is to have a 64-bit monotonically increasing generation counter in every block (whatever block size you use to write to the device), and use the blocks on the device in sequential order. In general, it does mean you need to "initialize" the device to all zeroes, unless it is already sufficiently initialized (all counters zeros – it can be easily, albeit slowly, verified).
On a device with N blocks, you then only need to read 2 + log2 N or so blocks, to find the most recent or oldest block. On a 8 GB SD card with 512 byte sectors/blocks, or 16,777,216 sectors, this means you only need to read 26 sectors to find the oldest or newest block; and when oldest and newest blocks are known, all other blocks are directly accessible without searching. So, it is quite fast and efficient, too. All this is easily written in library form – especially if you have a fixed structure for each block, say containing fixed-size records, or variable-sized records that do not cross a block boundary –, much easier than any filesystem driver.