Для начала вы не close()
файл, который вы открыли с fopen()
, вы должны fclose()
его.Здесь вы смешиваете два уровня абстракции: файловые дескрипторы и файловые указатели.
Кроме того, я думаю, вы обнаружите, что два файловых указателя поддерживают независимые смещения и буферы файлов.Тот, кто закрывает файл последним, записывает их данные последними, перезаписывая другой.
Измените порядок ваших fclose()
заявлений, и вы поймете, что я имею в виду:
#include<stdio.h>
int main (void) {
FILE *fp,*fs;
fs=fopen("c.dat","w");
fp=fopen("c.dat","w");
fputc('a',fp);
fputc('1',fs);
fclose(fp); // Try changing these
fclose(fs); // two around.
return 0;
}
Я сделалэто и последовательно закрывало содержимое на основе последнего файла.
И, прежде чем сказать, что вы должны были получить a
, потому что fp
был последним, который вы закрыли, вы сделали не закрыть fp
(с fclose()
).
То, что вы сделали , это попытаться close()
дескриптор файла, который почти наверняка был недействительным, потому что файл дескрипторы обычно являются относительно небольшими значениями (например, 0
, 1
, 2
), в то время как файловые указатели обычно являются относительно большими значениями (например, 0xdeadbeef
, 0xcaf3f00d
).
Таким образом, закрытие обоих этих файлов было оставлено на усмотрение среды выполнения C при выходе (и это, скорее всего, сделало бы это детерминистическим способом, поэтому вы всегда получаете одно и то же значение в файле).