Почему части вывода перезаписываются при перенаправлении в тот же файл, но не при подключении к терминалу?
Поскольку файл открыт дважды, отдельно ,на обычный файл, в обычном режиме записи.Каждое описание открытого файла для этого файла имеет свое собственное представление о текущей позиции файла, и именно туда идут данные, которые оно записывает.Каждая позиция файла продвигается только в соответствии с данными, записанными через соответствующее описание открытого файла.Какие бы данные ни записывались вторыми в данной позиции, они заменяют то, что было записано первым.
Этого не происходит для терминала, потому что терминалы не доступны для поиска.Как будто они всегда открыты в режиме добавления.Открытие файла журнала в режиме добавления даст половину решения, и в любом случае будет хорошей идеей:
#include <stdio.h>
int main() {
FILE *f=NULL;
f = fopen("/tmp/a_out_.log", "a"); // <-- here is the change
if (NULL == f) {
fprintf(stderr,"oopsie\n");
} else {
fprintf(stdout, "Something");
fprintf(f," messy ");
fprintf(f," jessy\n");
fprintf(stdout, " or another\n");
fprintf(f,"More stuff\n");
fclose(f);
}
}
Таким образом, записи в файл f
всегда идут в текущий конец файла.независимо от того, что могло быть сделано с файлом другими способами.Однако если вы хотите, чтобы существующий файл журнала был усечен, то вам придется сделать это самостоятельно, в отличие от того, когда вы открываете в режиме записи ("w"
).
Однако, как я уже сказал, хотя открытиев режиме добавления, вероятно, хорошая идея в этом случае, несмотря на то, что это только половина решения.Если стандартный вывод открыт для того же файла, отдельно, в обычном режиме записи, то запись с этого направления все еще может и будет перезаписывать другой вывод.Честно говоря, я бы сказал, что это не должно быть проблемой вашей программы .Если пользователь действительно хочет перенаправить вывод консоли программы в свой файл журнала, он может сделать это в режиме добавления, используя оператор перенаправления >>
вместо >
.Это будет дополнением к вышеприведенному решению.Если вместо этого они используют перенаправление >
, то оно на них, и я бы не стал предпринимать чрезвычайных мер для его обнаружения или приспособления.