Запись в одну и ту же строку файла на карте памяти.

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

Как писать в одну строку и с новой строки в файле - это всё просто и понятно из примеров. А как писать в одну и ту же строку, затирая предыдущее значение? Суть такая - в четвертой ( к примеру) строке файла указано значение - количество строк после. Т.е. дописали в файл новую строку вернулись в четвертую строку, стерли старое значение и записали туда новое(старое+1).

Для чего это нужно? Для тех кто надумает делать гпс-трекеры с записью в файл в формате OziExploer. Если делать вывод в формате путевых точек - то всё просто, в сетапе проверили наличие файла, если есть то продолжили писать в него, если нет - создали файл, записали в него шапку, описание шапки и "начинки" файлов .wpt и .plt есть тут - http://lud.livejournal.com/93087.html А для того чтоб создать полноценный файл трека, нужно постоянно менять значение в одной и той же строке в начале файла, где указывается количество точек в треке. Скетч не прикладываю, так как вопрос чисто теоретический, в общеобразовательных целях)))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

На карточке нет строк, ам есть "сектора" по 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.

 

Примечание: второй алгоритм более универсален и подходит так же для неизменной длины строки.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Если бы размер не менялся, наверное, подошёл бы seek(). Но у Вас строка расти будет. Пишите в первый (временный) файл точки. Как закончили писать, во второй файл пишите шапку с нужным количеством точек и переносите в него содержимое первого. Первого удаляйте.

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

Размер меняется от 1 до нескольких тысяч. Хотя можно это обмануть, записав например 1, а остальное добить пробелами, чтоб получилось 5-6 символов. Всё-таки пока что проще писать в формате .wpt а потом уже на ПК конвертировать их в .plt

kalapanga пишет:

seek()

Эту функцию я пробовал, считать прежнее значение она может, а вот записать новое - нет(

Надо ещё попробовать функцию position() помучать.