Усечение файла

03.12.2011 06:45:29 Просмотров 19 Источник

Задание разработать функцию, которая усекает существующий файл до указанных размеров Думал, что пройдёт такой вариант с добавлением EOF'a в нужном месте.

int n;
printf("input colvo simvolov\n");
scanf("%d",&n);
FILE *f;
f= fopen(file , "rb+");
n--;
for(;n>0;n--) getc(f);
fputc(4,f);

В итоге просто печатается на это место символ. Можно этот способ доработать? Или есть более изящное решение?

Спасибо.

У вопроса есть решение - Посмотреть?

Ответы - Усечение файла / Усечение файла

skegg

03.12.2011 07:03:31

На никсах самый простой способ изменить размер файла - использование системных вызовов truncate() и ftruncate().

Смотри man 2 truncate

Если нужно использовать только библиотечные стандартные функции, напиши, придумаем код.

https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment58915_58910
А я других и не знаю (чтобы действительно тот же файл (номер инода) остался).
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment58917_58910
Ну да, чтобы сохранить inod, пожалуй, другого варианта нет.
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment58919_58910
Хотя вот: копируем нужное количество байтов во временный файл открываем исходный файл с O_WRONLY | O_TRUNC записываем в него содержимое временного файла. Тот же алгоритм для стандартных функций.
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment59023_58910
в том и дело что нужно как бы разработать системную функцию. то есть остаётся только вариант скопировать сколько нужно в буфер а оттуда потом в переоткрытый начальный файл?
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment59035_58910
Не понятно: так можно использовать системные вызовы?
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment59036_58910
Разработайте системную функцию, которая усекает существующий файл до произвольных размеров, указанных в качестве аргумента, и опишите ее работу. Вот чёткое задание. Я так понимаю нет.
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment59039_58910
Ну, если с truncate никак, то как я описал. В буфер в памяти имеет смысл копировать, только если файл небольшой. Если же объем велик, то нужно скопировать во временный файл, потом из него, а его удалить. Еще вариант (если не важно сохранение inod): после копирования во временный файл уничтожаем начальный, а временному даем имя начального файла. EOF == 0. Ну добавится ноль где-то в файле. Это может только повлиять на чтение в текстовом режиме, а на длину это никак не может повлиять.
https://ru.stackoverflow.com/questions/58908/%d0%a3%d1%81%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0/58910#comment59041_58910
спасибо за помощь. А почему не работает добавление EOF в нужное место??
avp

04.12.2011 12:28:24

По поводу EOF в нужное место.

Вы пишете 4 (Ctrl-D) в файл. В Unix это просто символ, ничем не отличающийся от других. Вы путаете его с ^D, который, когда вводится с клавиатуры закрывает входной поток. На самом деле так на него реагирует драйвер клавиатуры, который и закрывает поток. Кстати, ^D можно переопределить, посмотрите команду stty.

Из Вашего комментария "Разработайте системную функцию", скорее всего следует, что требуется разработать не системный вызов, а команду (типа ls).

Поэтому смело используйте truncate().

Закрыть X