• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Nadpisywanie znaków na karcie SD
#1
Cześć,
mam projekcik, w którym chciałbym nadpisywać pewne dane zapisane w pliku txt na karcie SD. Z konfiguracją nie ma problemu. Kłopot jest z tym, że jak bym nie zakombinował, to nowy tekst jest zawsze dodawany na końcu pliku a nie w miejscu, w którym ustawiłem kursor. 
Poniżej przykładowy kawałek kodu i wynik działania.

Mój plik txt na początku zawiera takie dane:

aa
bb
cc
dd

Kod:
myFile = SD.open("/test1.txt", FILE_APPEND );
  Serial.print("Pozycja kursora na końcu: ");
  Serial.println(myFile.position());
 
  myFile.seek(5);
  Serial.print("Pozycja kursora po komendzie seek(): ");
  Serial.println(myFile.position());

  myFile.write('z');
  Serial.print("Pozycja kursora po komendzie println(): ");
  Serial.println(myFile.position());
  myFile.close();


Natomiast wynik działania jest taki:

Cytat:Pozycja kursora na końcu: 14
Pozycja kursora po komendzie seek(): 5
Pozycja kursora po komendzie println(): 15

aa
bb
cc
ddz


W jaki sposób mogę nadpisać dane na 5 pozycji kursora? Nie wchodzi w grę kopiowanie zawartości do plików tymczasowych ponieważ mój plik txt może być bardzo długi i będzie zajmować to za dużo czasu.
Jakieś pomysły?
michciobb
 
Odpowiedź
#2
(30-01-2024, 15:30)michciobb napisał(a): Cześć,
mam projekcik, w którym chciałbym nadpisywać pewne dane zapisane w pliku txt na karcie SD. Z konfiguracją nie ma problemu. Kłopot jest z tym, że jak bym nie zakombinował, to nowy tekst jest zawsze dodawany na końcu pliku a nie w miejscu, w którym ustawiłem kursor. 
Poniżej przykładowy kawałek kodu i wynik działania.

Kod:
myFile = SD.open("/test1.txt", FILE_APPEND );


A czego się spodziewałeś, jeśli otwierasz plik w trybie APPEND? Tak działa ten tryb na "dużych" systemach - każdy zapis jest dopisywany na końcu. Nie wiem jak to jest zrealizowane w bibliotece, ale normalnie używa sie O_RDWR, wtedy plik po otwarciu ustawiony jest na początku, ale można go dowolnie nadpisywać i dopisywać na końcu.

W pliku SD.h znajdują się następujące definki:
Kod:
#define FILE_READ O_READ
#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_APPEND)

Jeśli otworzysz plik w trybie FILE_WRITE - możesz też czytać. Istniejące tam dane pewnie nie zostaną usunięte - nie ma tam O_TRUNC.

Jednak dobrze uważaj co chcesz zrobić - nadpisywanie "typowego" pliku tekstowego to cienka sprawa,
 
Odpowiedź
#3
Miałem jakąś dziwną bibliotekę, która nie miała takich definicji: (O_READ | O_WRITE | O_CREAT | O_APPEND). Znalazłem inną i teraz już działa dzięki.
 
Odpowiedź
#4
(30-01-2024, 21:57)michciobb napisał(a): Miałem jakąś dziwną bibliotekę, która nie miała takich definicji: (O_READ | O_WRITE | O_CREAT | O_APPEND). Znalazłem inną i teraz już działa dzięki.

To jedna z "dziwności" środowiska Arduino - do każdego zadania jest dużo niezależnych bibliotek, napisanych przez różne osoby i w sumie nie wiadomo, czym się różnią. Ja patrzyłem na standardową biblioteką zawartą w samym pakiecie Arduino. Ostatnio podłączałem czujnik BME280 i bibliotek było w sumie około 10. Przypadły się jakiś ranking na forum, by wiadomo było czego użyć w konkretnym przypadku. Ja rozumiem, że czasami prościej jest napisać własne rozwiązanie niż rozgryzać czyjeś, ale czy to jest powód by zaraz to swoje wrzucać do sieci jako "konkurencje" dla poprzedniej? Normalnie, jak jakiś kawałem kodu nie działa, czegoś nie ma lub można zrobić lepiej to bierze się oryginał, poprawia i wrzuca jako kolejną wersję.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości