So long as you're using OOP (so that almost all of your code is in classes), you can't go wrong!
As far as learning C++ goes, you could make a C++ Minecraft map editor!
It's definitely tricky. The format is something like
region files contain a header of information, then 32x32 blocks (varying in size, but all being multiples of 4096 bytes with zeros on the end) of compressed chunk "files". You'll need to read the region header to locate the chunk data, take the data out for a single chunk (using iostream), decompress (tgz?) the data, and THEN you have a binary .nbt file.
The .nbt file is where the real object oriented programming comes in. The way it works is that NBT_Tags (as they're called) store all the data. There are different types of tags: Integers, floats, lists, and most importantly: compound tags. Compound tags and list tags can store other tags, so you get this great recursive structure!
You can have an abstract NBT_Tag object, which defines some basic functionality and some necessary functions (like "load_data", which would accept an istream object to read data from)
Since you can't have a pointer to an abstract class, I also had an "NBT_Object" class, which handles taking some NBT_Tag* foo, and calling foo->abc() on it, as well as handling destruction. (so you don't have to say "delete foo" everywhere)
So the NBT_Compound tag would have a vector of NBT_Objects, which you could access through things like "int NBT_Compound::length()", "NBT_Object NBT_Compound::at(n)", etc.
The loading functions can all be defined recursively, eg your code will be something like:
void NBT_SomethingOrOther::loadData(istream& obj)
{
myMember<<obj; //i forget the syntax exactly
//do other loading stuff here
myMember2.load(obj) //recursive call.
//finishing code here.
}
It's definitely more advanced but you'll learn a helluvalot!