необходимость fseek() в c

Часть кода 1: -

while(1)
    {
        ch=fgetc(pt);
        if(c==EOF)
        {
            break;
        }
        if(c==' ')
        {
            fputc('z',pt);
        }
    }

Часть кода 2: -

while(1)
{
    ch=fgetc(pt);
    if(c==EOF)
    {
        break;
    }
    if(c==' ')
    {
        fseek(pt,0,SEEK_CUR);
        fputc('z',pt);
        fseek(pt,0,SEEK_CUR);
    }
}

Я хочу заменить следующий символ после каждого space в файле. На этот файл указывает указатель pt.

Оба кода не показывают ошибок и работают нормально, но когда я извне открываю файл .txt, первый код ничего не делает, тогда как второй код успешно заменяет следующий символ после space.

Очевидно, что fseek(pt,0,SEEK_CUR); имеет значение.

Так что я не могу понять, что он делает во втором коде?


person kevin gomes    schedule 23.02.2014    source источник
comment
Вы уверены, что это fputc('z', ft), а не fputc('z', pt) во втором коде?   -  person AndyFaizan    schedule 23.02.2014
comment
@AndyFaizan : ой извините... Моя ошибка!!!!Это было pt   -  person kevin gomes    schedule 23.02.2014
comment
возможный дубликат изменить существующее содержимое файла в c   -  person Lee Duhem    schedule 23.02.2014
comment
@leeduhem: Не совсем так, но ответ решает проблему.   -  person AndyFaizan    schedule 23.02.2014
comment
@kevingomes: использование fseek() здесь - стандарт C требует операции позиционирования между операцией чтения и записи в потоке обновления или между записью и чтением. Это операция позиционирования между записью и чтением. Это не запрет; он помещает поток в режим, который позволяет следующему fgetc() работать правильно и надежно на разных платформах, как того требует стандарт C.   -  person AndyFaizan    schedule 23.02.2014
comment
@AndyFaizan: я также прочитал комментарий Jonathan Leffler, но я спрашиваю, что в этом случае делает присутствие fseek(pt,0,SEEK_CUR).   -  person kevin gomes    schedule 23.02.2014
comment
Разве мой комментарий не отвечает на этот вопрос?   -  person AndyFaizan    schedule 23.02.2014
comment
@AndyFaizan: в своем комментарии вы указали, что требует стандарт c. Это я тоже знаю. Я спрашиваю, что он делает?????   -  person kevin gomes    schedule 23.02.2014
comment
Из комментария - он переводит поток в режим, который позволяет правильно работать следующему fgetc(). В противном случае он работает неправильно, как часть 1 вашего кода. Я думаю, это об этом   -  person AndyFaizan    schedule 23.02.2014
comment
@AndyFaizan: Вы должны сделать это ответом.   -  person R.. GitHub STOP HELPING ICE    schedule 23.02.2014


Ответы (1)


Использование fseek() здесь. Стандарт C требует операции позиционирования между операцией чтения и записи в потоке обновления или между записью и чтением. Это операция позиционирования между записью и чтением. Это не запрет; он помещает поток в режим, который позволяет следующему fgetc() работать правильно и надежно на разных платформах, как того требует стандарт C.

РЕДАКТИРОВАТЬ:

2 вызова fseek() необходимы, потому что первый действует как «нерабочий» вызов между fgetc() и последующим вызовом fputc(). После fputc() второй действует как «нет операции» между fputc() и последующим вызовом fgetc(). (так как цикл запущен)

person AndyFaizan    schedule 23.02.2014
comment
тогда зачем нужны два fseek() - person kevin gomes; 23.02.2014
comment
Попробуйте удалить последний fseek() и проверьте - person AndyFaizan; 23.02.2014
comment
Я щелкнул, ничего не произошло - person kevin gomes; 23.02.2014