Переход назад на один в файловом потоке - PullRequest
2 голосов
/ 04 марта 2012

Скажем, у меня есть такой указатель файла:

file_ptr = fopen(“test.txt”, “r+”);

и я хочу изменить значение ASCII каждого char при перемещении по потоку (я делаю это как шифр, поэтому, если есть лучший или более эффективный способ сделать это, пожалуйста, дайте мне знать) .

Я пытаюсь использовать цикл while(!feof(file_ptr)) {} с fgetc() и fputc, но file_ptr будет указывать на следующий символ, поэтому я хочу знать, есть ли что-то, что я могу сделать, направить его назад одно место.

По сути, я хочу знать поток файлов, эквивалентный:

char* blah="blah blah";
char* index=blah;
index++;/*how to navigate a file stream in this way*/

1 Ответ

6 голосов
/ 04 марта 2012

Да: вы можете использовать функцию fseek :

fseek(file_ptr, -1L, SEEK_CUR); // move backwards one character

Кроме того, после вашего fputc и до вашего fgetc вы захотите позвонить fseek еще раз:

fseek(file_ptr, 0L, SEEK_CUR); // don't move

просто для уведомления системы о том, что вы переключаетесь между чтением и записью, чтобы она знала, как правильно очищать все буферы и еще много чего.(В противном случае вы, возможно, не окажетесь там, где вы думаете.)

Кстати, чтобы это работало правильно, вы захотите открыть файл в двоичном, а не текстовом режиме:

file_ptr = fopen("test.txt", "rb+");

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

...