char*s are not strings. They're pointers. If you want to have strings, use strings.
What's happening is you're setting all your pointers to point to the same buffer (your "filename" buffer). So when you print them, you'll print whatever the filename buffer holds. Of course since they all point to the same data, they will all print the same string when you try to print them.
What makes this especially bad is that your filename buffer will go out of scope, leaving your args pointers as bad pointers which means they might print random garbage and/or give you an access violation.
Save yourself a bunch of headaches and just use strings when you want to keep track of strings:
1 2 3 4 5 6 7 8
string args[12]; // <- string, not char*
int child=0; // <-why were you starting at 1? arrays start at zero
while(!filelist.eof()) {
// char filename[20]; <- no need for this
filelist>>args[child]; // <- just read directly to your args array
// args[child]=filename;
child++;