Как я могу сохранить положение указателя FILE в файле в другом указателе файла?

У меня есть следующий код, в котором tmp FILE * не сохраняет предыдущую позицию fp (равную 0). На самом деле он меняется вместе с fp, когда я использую fseek().

Выход:

fp=0 fp=40 tmp=40

Как я могу заставить его работать так, чтобы tmp сохранял исходное положение?

main()
{
        FILE *fp,*tmp;
        char *name;

        name=getfilename();

        if((fp=fopen(name,"wb"))==NULL)
        {
                puts("\n CAN'T OPEN FILE FOR SAVING...\n");
                return ;
        } 

        printf("fp=%ld",ftell(fp));

        tmp=fp;

        fseek(fp,sizeof(int)*10,SEEK_SET);

        printf("fp=%ld tmp=%ld",ftell(fp),ftell(tmp));
}

person MattSt    schedule 17.07.2014    source источник
comment
И tmp, и fp указывают на одно и то же, поэтому любое изменение одного указателя повлияет на другой. Если я правильно понимаю ваш вопрос, вы в основном хотите 2 разные позиции чтения/записи в одном и том же файловом потоке, верно?   -  person Drew McGowen    schedule 17.07.2014
comment
да.. правильно. Как это можно сделать?   -  person MattSt    schedule 17.07.2014
comment
@matts как насчет того, чтобы просто использовать ftell для получения позиции и fseek для ее восстановления?   -  person Maciej Piechotka    schedule 17.07.2014
comment
Насколько я знаю, это изначально не поддерживается, я думаю, из-за какого-то состояния гонки и/или двусмысленности. Я думаю, что один из вариантов - вручную сохранить и восстановить позицию по мере необходимости?   -  person Drew McGowen    schedule 17.07.2014
comment
В зависимости от системы (т.е. не Windows): tmp = fopen(name, "rb"); fseek(tmp, ftell(fp), SEEK_SET); Но будьте очень, очень, очень осторожны   -  person Elias Van Ootegem    schedule 17.07.2014
comment
См. ссылку ниже: ‹stackoverflow.com/questions/6099315/duplicating-file- указатели  -  person rohit    schedule 17.07.2014
comment
Если поддерживается (например, Linux), вы можете открыть файл, используя open с флагом O_SYNC, чтобы убедиться, что fd блокирует процесс.   -  person Elias Van Ootegem    schedule 17.07.2014


Ответы (1)


Оба указателя указывают на одну и ту же структуру FILE. При желании вы можете просто открыть файл дважды, и в этом случае указатели будут полностью независимыми.

person qdot    schedule 17.07.2014