LINUX.ORG.RU

C и файлы...


0

0

Значит такая ситуауия: буферизированный ввод.вывод. Открываю файл f как текстовый для
чтения/записи. Читаю из него несколько строк. Как отсечь остальные, т.е. сделать так чтобы
этот файл состоял только из прочитанных строк.
Заранее благодарен.


Отсечь верхурку ?
IMXO никак создать tmp и скопировать все оставшеся туда.

Aleks_IZA
()

Не, насколько я понял, надо, наоборот, оставить только прочитанное.

тогда:

FILE *file = fopen(...);

/* прочитаем чего-нить */
...

/* позиционируем на начало файла */
fseek(file, 0L, SEEK_SET);

/* запишем то, чего считали */
...


ВСЕ.

stormbringer
()

To stormbringer :

Хм-м, вы хоть сами поняли, что написали ? ;-)

С каких пор fseek() отрезает хвост файла ?

Рекомендую:

$ man ftruncate
$ man truncate

Илья.

anonymous
()

To stormbringer :

Хм-м, вы хоть сами поняли, что написали ? ;-)

С каких пор fseek() отрезает хвост файла ?

Рекомендую:

$ man ftruncate
$ man truncate

Илья.

anonymous
()

Хм интересно надо будет посмотреть что быстрее и лучше будет работать
truncate

или open(fd,O_TRUNC)
и потом записать что было прочитанно ?

Aleks_IZA
()


Ну, OP некорректно поставил вопрос - непонятно,
то ли он (1) считывает _первые_ сколько-то строк
из файла и хочет обрубить хвост, или он (2) считывает
произвольные строки из разных мест файла и хочет сделать
теперь новый файл из этих строк.

Если (1), то IMHO надо truncate() - так как писать в
файл вообще _ничего_ не надо.

Если (2), то тогда я бы предложил записать считанное в
некий временный файл (ессно на той же filesystem) и потом
сделать rename(2). rename - атомарная операция, посему
какая-бы херня не случилась, пользователь будет иметь
файл с корректными данными (или новый, или старый).
Если же делать open с O_TRUNC, то кто его знает - вдруг
write() не получится - а данные-то уже того...тю-тю...обидно...

Илья.


anonymous
()

Ну если быть совсем точным, то читается весь файл в память, где он изменяется, а потом из памяти должен быть сохранен в том же файле начиная с его начала :-).

syomin
() автор топика


Ну тады я бы писал во временный файл и потом rename().
Еще один аргумент за такой подход: если ты пишешь сразу
в свой "главный файл", то какое-то время он находится
в не consistent состоянии (пока твоя программа не все
записала). Соотвественно, если другие процессы буду
открывать/читать этот файл, то они прочитают совсем не то,
что ожидается. Хотя конечно есть locking...

Короче, выбор task-dependent как обычно...

Илья.

anonymous
()

Предположим, что я буду писать во временный файл, а потом его переименовывать. Тогда необходимо будет каким-то образом сохранить права доступа к исходному файлу и его принадлежность файла к владельцу/группе. А как это осуществить, если прога выполняется под обычным пользователем?

syomin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.