#1 07.12.06 22:01
Как записывать данные в файл в произвольном месте?
Как писать в файл в произвольном месте? Возможно увеличение размера файла
Я делаю так:
Код::
int p=123; FILE* fp=fopen(filename,"a+"); fseek(fp,0l,SEEK_SET); fwrite(&p,sizeof(p),1,fp); fclose(fp);
Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Offline
#2 07.12.06 22:11
Re: Как записывать данные в файл в произвольном месте?
Укроп написал(а):
стандартными способами афаик так делать нельзя. в случае когда тебе надо вставить в середину ты перекатываешь файл по новой,всобачивая вставочный сегмент в середине.
хотя в принципе можно, если работать напрямую с диском, и оперировать цепочками FAT(или иной ФС на который ты собираешься работать)
ЗЫ по такому принципу мне афаик работают простые файл-кеши записывают только те области ФС которые были изменены, вызывая впрочем фрагментацию
Это не я бляяя...
Offline
#3 07.12.06 22:33
Re: Как записывать данные в файл в произвольном месте?
Тогда другой вопрос. Как мне вставить в начало файла каие-либо данные, не используя вспомогательный фаил? Есть 1 вариант: грузить данный фаил в динамический массив, а потом записать все, что нужно и уж после переписать все из массива обратно в фаил. Еще вариант могут быть?
Offline
#9 08.12.06 22:40
Re: Как записывать данные в файл в произвольном месте?
Либо как Ratus сказал, либо двигать все (что очень нерационально, если файл не мизерный). Работа в данном случае с файлом - сродни работы с памяться. Так себе и представляю - "У меня проблема, не сдвигается память" ;-)
Исправлено asp (08.12.06 22:40)
Offline
#10 09.12.06 00:40
#11 09.12.06 15:43
Re: Как записывать данные в файл в произвольном месте?
asp, дело в том , что по заданию лабы мне нужно записать массив файловых уазателей на строки в начало этого же файла.Следовательно размер файла станет больше. Но если я открываю файл с атрибутом "a+" то пишется только в конец файла.То есть я не могу этот массив записать. А если открываю с атрибутом "r+" то все хорошо-все пишется и сдвигается, но последние строки не дописываются, так ка в этом режиме не разрешается увеличивать размер фаила.
Единственный выход, как мне кажется, грузить файл в динамический массив, а оттуда нормально писать.
Offline
#12 09.12.06 18:53
Re: Как записывать данные в файл в произвольном месте?
Какое-то странное задание. Смысл-то какой именно в начало файла записать эти указатели? Тогда сами указатели изменятся из-за перемещения строк - придется корректировать. Но это в принципе не проблема.
Процитируй сюда свое задание - может че неправильно понял?
Теперь о "r+" и "a+". У меня (MS Visual Studio 2005) при режиме "r+" все замечательно пишется в любое место файла, перезаписывая то, что там уже есть, и размер файла изменяется.
Offline
#13 09.12.06 22:28
#14 10.12.06 01:57
Re: Как записывать данные в файл в произвольном месте?
Ratus, вся фишка в том, что файл со строками уже существует, ничего там уже не выделишь. Вот если бы можно было создать новый (самое кстати логичное в данной ситуации) - вот тогда конечно, в начале надо некоторую область зарезервировать под указатели, чтоб при изменении ничего не передвигать.
Offline
#15 10.12.06 03:49
#16 10.12.06 12:27
Re: Как записывать данные в файл в произвольном месте?
Draloskop написал(а):
при режиме "r+" все замечательно пишется в любое место файла, перезаписывая то, что там уже есть, и размер файла изменяется.
Ну, так перезапишется же, но хоть убей больше размер файла не сделаешь, т.к. "r+" нельзя увеличить размер файла. Сама проверяла,не получается.
А нельзя так сделать?...
rewind(fp);
...и под режимом "a+" сделать запись в начало.
Offline
#17 10.12.06 14:57
#18 10.12.06 23:08
#19 11.12.06 01:17
Re: Как записывать данные в файл в произвольном месте?
Glory, я тоже проверил - размер увеличился.
Был файл 4 байта, я его открыл ("r+") и записал в начало 12 байт. Файл после этих махинаций стал 12 байт. Открыл в блокнотике и проверил.
Про "a+" и rewind(). В MSDN по этому поводу написано:
When a file is opened with the "a" or "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Thus, existing data cannot be overwritten.
Так что нельзя.
Offline

