Запись в одну и ту же строку файла на карте памяти.
- Войдите на сайт для отправки комментариев
Как писать в одну строку и с новой строки в файле - это всё просто и понятно из примеров. А как писать в одну и ту же строку, затирая предыдущее значение? Суть такая - в четвертой ( к примеру) строке файла указано значение - количество строк после. Т.е. дописали в файл новую строку вернулись в четвертую строку, стерли старое значение и записали туда новое(старое+1).
Для чего это нужно? Для тех кто надумает делать гпс-трекеры с записью в файл в формате OziExploer. Если делать вывод в формате путевых точек - то всё просто, в сетапе проверили наличие файла, если есть то продолжили писать в него, если нет - создали файл, записали в него шапку, описание шапки и "начинки" файлов .wpt и .plt есть тут - http://lud.livejournal.com/93087.html А для того чтоб создать полноценный файл трека, нужно постоянно менять значение в одной и той же строке в начале файла, где указывается количество точек в треке. Скетч не прикладываю, так как вопрос чисто теоретический, в общеобразовательных целях)))
На карточке нет строк, ам есть "сектора" по 512 байтов.
Соответственно, то, что Вы хотите, можно сделать только при условии, что длина строки не изменяется.
Алгоритм такой:
1. Тем или иным образом выясняем, в каком именно секторе (или двух смежных) находятся данные, которые необходимо перезаписать.
2. Этот сектор считывается о ОЗУ.
3. В нем изменяются нужные байты.
4. Сектор записывается на прежнее место.
Теперь пару замечаний:
- неизбежной платой станет расход дополнительно полукилобайта оперативной памяти.
- т.к. в Ардуино недостаточно ресурсов, чтобы организовать полноценную работу с файловой системой, стандартные средства для этой задачи Вы вряд ли найдете, придется делать самому ручками.
Возможен и более общий случай: длина перезаписываемой строки внутри файла изменяется. В этом случае алгоритм таков:
1. Создаем новый файл (файл №2).
2. Последовательнео читаем исходный файл (файл №1).
3. Все прочитанное переносим в файл №2.
4. Когда дошли до нужной строки, считываем ее из файла №1.
5. А в файл №2 записываем не ее, а новую измененную строку.
6. Начиная со следующей строки выполняем п.п.2 и 3.
7. Закрываем файл №2.
8. Уничтожаем файл №1.
9. Переименовываем файл №2 названием, которое было у файла №1.
Примечание: второй алгоритм более универсален и подходит так же для неизменной длины строки.
Если бы размер не менялся, наверное, подошёл бы seek(). Но у Вас строка расти будет. Пишите в первый (временный) файл точки. Как закончили писать, во второй файл пишите шапку с нужным количеством точек и переносите в него содержимое первого. Первого удаляйте.
Размер меняется от 1 до нескольких тысяч. Хотя можно это обмануть, записав например 1, а остальное добить пробелами, чтоб получилось 5-6 символов. Всё-таки пока что проще писать в формате .wpt а потом уже на ПК конвертировать их в .plt
seek()
Эту функцию я пробовал, считать прежнее значение она может, а вот записать новое - нет(
Надо ещё попробовать функцию position() помучать.