2013-05-22 3 views
3

Я прочитал это о переключателе между операций чтения и записи (и наоборот) для файлов, открытых для обновления с помощью fopen() (LINK)Сброс файлов fopen() 'ed файлов, открытых в режиме обновления, между операциями чтения и записи. Необходима скрытая промывка?

«Для открытых файлов для обновления (те, которые включают в себя„знак +“), на котором разрешены как входные, так и выходные операции, поток должен быть сброшен (fflush) или перемещен (fseek, fsetpos, перемотка назад) между либо операцией записи, за которой следует операция чтения, либо операция чтения, которая не достигла конца, после чего следует операция записи ».

Есть упомянутые здесь, что я хотел бы подчеркнуть

  • поток должен быть очищен (fflush) или приложена (FSEEK, fsetpos, перемотка назад) между каждой операции записи с последующим чтением две вещи
  • или операция чтения, которая не дошла до конца файла, за которой следует операция записи.

1) Что касается первого пункта, то мы явно необходимо промывать между записи и чтения operation.I значит, предположим, что, если мы намерены записать в новый файл, а затем прочитать его обратно . В этом случае с использованием fseek() или rewind(), чтобы добраться до начала файла после того, как запись имеет смысл, а в качестве побочного эффекта он будет очищать буфер. Но я хочу знать, что произойдет, если мы будем обновлять/переписывая первую часть уже существующего файла новыми данными, но как только мы закончили, мы хотим, чтобы сразу же начал читать оставшиеся старые данные с этой точки? Нужно ли использовать что-то вроде fseek(pFile,0,SEEK_CUR), чтобы мы сбросили буфер для перехода write-read и в то же время не изменили положение указателя файла? Такая же путаница возникает и во втором сценарии, когда мы хотим прочитать первую половину файла и сразу после этого хотите начать писать там. Ответьте на это.

2) Вторая часть о reading operation which did not reach the end-of-file, кажется, подразумевает, что если операция чтения достигает оконечный файл, и мы намерены написать после этого, нам не нужен буфер, чтобы быть промыты для этого read-write перехода Можете ли вы подтвердить это, что это значит? Только write-read переход нужен для очистки, а не read-write переход, особенно если чтение достигло конца файла?

+0

Дубликат http: // stackoverflow. com/questions/1713819/why-fseek-or-fflush-is-always-required-between-reading-and-write-in-read-w? rq = 1 – bikram990

+0

@ bikram990 Это было близко. Но он все еще не работает Ответы на такие вопросы, как «fseek (pFile, 0, SEEK_CUR)», являются, среди прочего, решением. – Thokchom

+0

Я добавил практическую проблему с 'fseek (pFile, 0, SEEK_CUR)' – bikram990

ответ

0

Вы правильно пригвоздили вторую точку, то есть, если мы достигнем EOF, а затем мы намереваемся написать ее штраф, его как fseek - SEEK_END.

Но для 1-й точки необходимо, чтобы мы взяли контрольную точку, чтобы начать операцию чтения после операции записи, т. Е. Предположим, что вы пытаетесь перезаписать некоторые динамические данные в файле, чтобы длина могла варьироваться в зависимости от того, что вы может не получить точного положения, о котором вы думаете.

пример: скажем, файл test.txt содержит данные hello world вы хотите обновить hello текст в какой-то другой текст сказать share так по вам текст должен быть share world.Следовательно, длина будет одинаковой, вы получите точный результат, но как насчет замены hello на bye10 или someother, то вы либо получите данные об мусор, либо не будете иметь данных (если строка слишком длинная)