Когда вы достигаете конца файла, вы не break
цикл. Таким образом, вы вызываете fputc(c, fpOut);
с c==EOF
, что, вероятно, является неопределенным поведением, или, по крайней мере, запись байта \0xff
.
И вы не вызываете fclose
в вашем цикле while(argc--)
, поэтому ваши файлы (кроме последних) в большинстве случаев никогда не закрываются и не сбрасываются.
Наконец, вы не проверяете результат fopen
и вам следует проверить, что он не равен нулю (и напечатать сообщение об ошибке, возможно, с чем-то вроде strerror(errno)
или perror
, в этом случае).
Вы должны были выяснить это с помощью отладчика (например, gdb
в Linux) и, возможно, с помощью предупреждений компилятора (но gcc-4.6 -Wall
не обнаружил никаких ошибок в вашем примере).
Вы можете решить, что имя выходного файла связано с именем входного файла, возможно, с
char outname[512];
for(i = 1; i < argc; i++) {
fpIn = fopen(argv[i], "rb");
if (!fpIn) { perror (argv[i]); exit(1); };
memset (outname, 0, sizeof (outname));
snprintf (outname, sizeof(outname)-1, "%s~%d.out", argv[i], i);
fpOut= fopen(outname, "wb");
if (!fpOut) { perror (outname); exit(1); };
/// etc...
fclose(fpIn);
fclose(fpOut);
fpIn = fpOut = NULL;
}