вывод c-программы - PullRequest
       3

вывод c-программы

0 голосов
/ 04 ноября 2010
#include<stdio.h>
int main()
{

        FILE *fp,*fs;
        fs=fopen("c.dat","w");
        fp=fopen("c.dat","w");
        putc('a',fp);
        putc('1',fs);
        close(fs);
        close(fp);
        return 0;
}

Независимо от исполнения заказа

 putc('a',fp);putc('1',fs);   


 putc('1',fs);putc('a',fp);

содержимое c.dat только '1'. Может кто-нибудь объяснить причину?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

Для начала вы не 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 был последним, который вы закрыли, вы сделали не закрыть fpfclose()).

То, что вы сделали , это попытаться close() дескриптор файла, который почти наверняка был недействительным, потому что файл дескрипторы обычно являются относительно небольшими значениями (например, 0, 1, 2), в то время как файловые указатели обычно являются относительно большими значениями (например, 0xdeadbeef, 0xcaf3f00d).

Таким образом, закрытие обоих этих файлов было оставлено на усмотрение среды выполнения C при выходе (и это, скорее всего, сделало бы это детерминистическим способом, поэтому вы всегда получаете одно и то же значение в файле).

1 голос
/ 04 ноября 2010

Вы не указали неподписывающуюся ОС, но в системах win и * nix файловые буферы распределяются между процессами, поэтому:

    putc('a',fp); 
    putc('1',fs);

записывают в одну и ту же записьадрес в том же буфере, если вы измените порядок операторов putc в обратном порядке, вы получите «a» в файле. *

NOT

Просто показывает, как все это сложно.Я пробовал это, и что влияет на вывод, это порядок, в котором файлы открываются - первое открытие всегда имеет приоритет.

1 голос
/ 04 ноября 2010

Вы открываете один и тот же файл для записи дважды. В этот момент все ставки отменены.

0 голосов
/ 04 ноября 2010

Я думаю, это потому, что вы сначала открыли c.dat через fs = fopen, а затем какая-то блокировка не позволяет записать «a», так как это потребует повторного открытия файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...