• Как записывать в файл до тех пор пока есть место в нем?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как записывать в файл до тех пор пока есть место в нем?

    Это не функционал файловой системы. Порешай такие задачи на уровне прикладного кода. Это не сложно.

    Более того. В свете развития современных файловых систем (облачных систем) понятие "свободное место" сильно девальвировало. Его стало сложно посчитать. Оно уже не является уравнением где можно суммировать логический размер файлов и что-то прикидывать. Файлы стали обладать свойством SPARSE - разреженные, COMPRESSED - сжатые, стали иметь хард-линки (несколько внешних имен одного файла).

    Во времена 32х битных ОС файлы часто ограничивались в 2Гб сверху. И это и сейчас наблюдается по
    устаревшим API для файлов. А после ext4 например размер файлов лимитирован числом exbibyte а это на 12
    порядков поболее чем 32х битки. Короче такой размер нам никогда не заполнить ничем.

    Кроме того при использовании PIPELINE или канальных устройств само понятие размер файла лишено
    смысла. Файл представляет собой трубу через которую с одно стороны пишут а с другой читают
    информацию. И это - хорошо. Это гибкость файловой системы которую развивают еще со времен ОС Unix.
    Зачем нам эту гибкость ограничивать.
    Ответ написан
    6 комментариев
  • Как записывать в файл до тех пор пока есть место в нем?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    echo "ew=\`cat /dev/urandom \| tr -dc 'A-Za-z0-9' \| head -c 76\`" >./cmd_file.tmp && dd if=./cmd_file.tmp of=./test.txt obs=100049 count=1 && rm ./cmd_file.tmp
    Ответ написан
    3 комментария
  • Как записывать в файл до тех пор пока есть место в нем?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Он как видно на 100049 байт.

    Мне нужно записывать в него строки ew=`cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 76` до тех пор пока он не заполнится полностью.

    то есть, у нас есть символы от A-Z a-z 0-9 каждый из которых занимает 1 байт
    нужно записывать строки с 76 символами + 1 символ перевода строки
    по итогу получим

    100049/77 = 1299 полных строк и немного хвоста
    размер хвоста
    100049-1299*77 = 26 символов

    если всё это перевести в bash-код то получим следующее
    #!/usr/bin/env bash
    
    #вводные
    FILE=file.txt
    S=100049 # общий размер в байтах
    s=76   # максимальное количество однобайтовых символов на строку
    
    N=$[S/(s+1)]
    n=$[S-N*(s+1)]
    
    echo "Cтрок + хвост = $N + $n"
    
    rm -rf $FILE
    for (( i = 0; i < $N; i++ )); do
    	cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c $s >> $FILE
    	echo >> $FILE
    done
    cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c $n >> $FILE
    
    echo "Файл записан"
    echo "Размер файла $FILE = $(stat -c %s $FILE) байт"

    по итогу получим файл с необходимым объёмом данных
    Ответ написан
    Комментировать
  • Как записывать в файл до тех пор пока есть место в нем?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Если взять бесконечный цикл и записывать, то когда не хватит места в фале, цикл он остановится?

    Чего ради? Конечно не остановится. Команда truncate всего лишь делает усечение файла до определенного размера, но ничего не мешает писать в него, пока на диске место есть.
    Ответ написан
    3 комментария
  • Как записывать в файл до тех пор пока есть место в нем?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    В файл можно писать до тех пор пока есть место на диске
    Ответ написан
    1 комментарий
  • Как создать указатель на вводимый текст?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Заводим переменную типа char *
    Берем в нее память килобайт 10, зануляем
    Считали текст, сдвинули указатель, запомнили
    (повторять, пока есть текст)
    По завершению - массив текста и массив указателей, указывающих на начало каждой строки
    Ответ написан
    Комментировать
  • Как создать указатель на вводимый текст?

    @res2001
    Developer, ex-admin
    Ну и покажите что вы пытались сделать.

    Вообще текст куда-то должен попасть после ввода. Для этого функции чтения вы должны дать буфер, куда она и запишет, все что прочитала.

    В типичной ситуации, когда не известно сколько данных будет введено, вы выделяете буфер некоторого размера (1Кб например), вызываете функцию чтения с этим буфером. Если функция полностью забила весь буфер и еще хочет - выделяете буфер большего размера, копируете содержимое предыдущего буфера, предыдущий буфер удаляете. Снова вызываете функцию чтения со смещением в новом буфере. И так пока не прочитаются все данные.
    Если же введенные данные должны быть как-то обработаны, то обычно все что прочиталось сразу обрабатывается, после обработки буфер обычно пустой (или заполнен остатками не обработанных данных, которые надо дополнить) и читаете снова в тот же буфер.

    Когда вы выделите буфер (с помощью malloc например), вы получите указатель. Пока этот указатель указывает на "пустой" буфер. После чтения в буфер, указатель будет указывать на прочтенные данные. Функция чтения вернет вам еще и длину прочитанных данных. Этого достаточно для дальнейшей работы с буфером.
    Ответ написан
    8 комментариев
  • Как извлечь строку из файла?

    Vindicar
    @Vindicar
    RTFM!
    Нет понятия "извлечь строку". Есть понятие "прочитать строку" и "удалить строку".
    В случае с "удалить" подразумевается, что мы
    а) либо перезаписываем файл целиком,
    б) либо перезаписываем всё, что идёт после начала удаляемой строки (т.е. копируем то, что после конца удаляемой строки) и обрезаем конец файла.

    Вообще текстовые файлы - весьма неблагодарная штука для редактирования. Лучше в таких случаях использовать либо другой формат данных, либо вообще другое хранилище.
    Ответ написан
    2 комментария