The way I've seen it, C++ would be the way to go, particularly if you force exposure to namespaces and the precompiler.
Java basically amounts to a really clean API over C++ with some minor nuance differences. C doesn't expose you
to object oriented programming, which although will give you a better understanding of memory manip, will not
give you the experience a typical company will hope you've exposed yourself to.
C# is another step away from C++ and is likely not too bad to pick up as an extension off it.
As for topics to consider, really look into the weirdness that unions introduce (playing with floating point numbers
on a bit level is a good way to get into this). Figure out how to deal with collections, including an overview of
the differences between search and sort algorithms. You don't need to know how to write them as much as how to
select one or figure out how to write them when you need to. Cover synchronization on multiprocessor architectures.
Get a VERY good feel for inheritance and UML. It sucks to learn and the tools for it are usually quite painful to
play with, but the time it can save in the end when working in a team of 10 on 100,000 lines of mixed languages is
remarkable.
Remember that working on a piece of code that is 100k lines or more is going to take you months to get used to, will
be too large for you to think about in its entirety unless you've been working on it since the beginning and have
forgone anything resembling a social life, and will also be complex and challenging and possibly very fun.
You should get used to version control. Try RCS, not because it's the latest and greatest, but because you're likely
to see it. CVS is newer (old) and more likely to be the incumbent tech at an arbitrary company. Subversion is great
and if you get into a place that uses that, you should be quite happy. I've also seen perforce and a couple others.
Cultural choice, and it's dependent on the size of the code and how many engineers drive decisions at a high level.
It also depends on how often the company picks up new projects.
For an idea of what I do, my primary language of choice is AVR assembly. I like playing close to hardware in bit gritty
RISC architectures. From there, it's C (smaller file sizes than C++ by far unless you're crafty), C++, Java.
Java makes for a very nice prototyping language, and it encourages some commenting and coding practices in a way I can
approve of, even if its "we'll take care of it" view of memory management is something I don't quite agree with.
Otherwise, good luck!