С 64-разрядной версией Linux подпись fseek()
не вызывает проблем; параметр offset - это long
, что означает, что он будет 64-битным количеством и может легко обрабатывать файл размером 2-4 гигабайта. Если бы вопрос касался 32-разрядного Linux или для 64-битной Windows, история была бы иной. У вас возникнут проблемы с смещениями между 2 GiB и 4 GiB.
Предположим, что поток файлов открыт для чтения и записи. Предположим, что позиция бита задается через абсолютное смещение байта в файле плюс число бит (0 ... 7). Предположим, что бит должен измениться, поэтому операция переключает бит от 1 до 0 или от 0 до 1. Предположим, что нет необходимости хранить запись текущей позиции в файле, чтобы ее можно было восстановить после переброса бит. Затем последовательность операций может быть:
void flip_bit(FILE *fp, long offset, int bitno)
{
int c;
assert(fp != 0);
assert(offset >= 0);
assert(bitno >= 0 && bitno < 8);
fseek(fp, offset, SEEK_SET);
if ((c = getc(fp)) != EOF)
{
c ^= 1 << bitno;
fseek(fp, -1L, SEEK_CUR); // Step backwards 1 byte
putc(c, fp);
fflush(fp);
}
}
Каждое допущение, которое вы изменяете, вызывает соответствующие изменения кода. Нужно fflush(fp);
, чтобы максимизировать вероятность внесения изменений на диск, чтобы другой процесс его видел. Кроме того, fflush(fp)
означает, что это безопасно использовать поток для входа (или выхода) даже без вмешательства искать (ISO/IEC 9899: 2011 §7.21.5.3 The fopen
функции, ¶7):
Когда файл открывается с режимом обновления ('+
' в качестве второго или третьего символа в выше списка значений аргумента режима), как вход и выход могут выполняться в связанном потоке .Однако выход не должен быть непосредственно с последующим входом без промежуточного вызова функции fflush
или к функции позиционирования файла (fseek
, fsetpos
или rewind
), и ввод не должен непосредственно следовать за выходом без промежуточного вызова функция позиционирования файла, если только операция ввода не завершает работу с файлом.
Если вы хотите, чтобы гарантировать, что бит установлен, то замените назначение:
c |= 1 << bitno;
Если вы хотите, чтобы обеспечить бит сбрасывается, замените назначение:
c &= ~(1 << bitno);
I пока еще не совсем уверен и все еще нахожу метод. –
Посмотрите 'fseek'. –
Вам нужно установить бит, сбросить бит или переключить бит? Будет сложно, если не невозможно, настроить один бит, не читая, по крайней мере, байт, содержащий этот бит заранее. Как определяется бит? У вас есть бит во всем файле или номер байта и номер бита в байте? Вы на 32-битной или 64-битной машине? –