Почему вы ищете входной файл после чтения?Поскольку вы в большинстве случаев будете читать 1024 байта (то есть n
будет где-то между 0 и 1024), вы будете постоянно искать что-то за пределами того места, где вы оставили указатель входного файла, так что вы потеряете данные в передаче (включая, вероятно, за конец файла, когда вы приближаетесь к концу).
Это может быть одной из причин, по которой у вас есть бесконечный цикл, но далекоболее коварным является использование while
для записи.Так как при успешном возвращении значения будут больше нуля, вы будете постоянно записывать первый кусок в файл снова и снова.По крайней мере, до тех пор, пока у вас не закончится место на диске или другие ресурсы.
Вам также не понадобится seek
при записи.Вызовы read
и write
делают то, что должны и правильно передвигают указатель файла для следующего read
или write
- это не то, что вам нужно делать вручную.
Вы, вероятно, можете упростить все это до:
while ((n = read (in, buf, 1024)) > 0) {
if ((m = write (out, buf, n)) != n) {
perror ("error writing out");
exit (-1);
}
}
, что имеет следующие преимущества:
- избавление от вызовов
seek
; - удаление бесконечного цикла;
- проверка того, что вы написали все запрошенных байтов.