I personally preffer C, since is lower level, hence you can control it better.
Here is an example on what C++ can do when doing low level:
void SpreadfileReader::open(const std::string& filename, size_t qt_mnt, size_t offset_mnt=0)
{
semaphore++;
this->filename=filename;
fd=open64(filename.c_str(),O_RDWR | O_CREAT,S_IWUSR | S_IRUSR | S_ISUID);
size_t page_size=sysconf(_SC_PAGE_SIZE);
qt_mnt+=page_size-qt_mnt%page_size;
archivist::ensure_size(fd,qt_mnt+qt_mnt);
memory=(FSDS_Event*)mmap64(NULL,qt_mnt,PROT_READ|PROT_WRITE,MAP_SHARED,fd,offset_mnt);
madvise((char*)memory,qt_mnt,MADV_SEQUENTIAL);
madvise((char*)memory,qt_mnt,MADV_DONTDUMP);
max_offset=qt_mnt;
max_w_offset=(FSDS_Event*)((char*)memory+qt_mnt-(qt_mnt%EventTrait<0>::size()));
write_cursor=memory;
mnt_offset=offset_mnt;
}