вопрос по библиотеке SD
- Войдите на сайт для отправки комментариев
Сб, 11/05/2019 - 00:41
Кратко
такое ощущение, что seek влияет только на read, а write всегда происходит в конец файла
Кратко
такое ощущение, что seek влияет только на read, а write всегда происходит в конец файла
ДОброго времени суток Уважаемые коллеги, не сочтите за труд посмотреть...
написал такой вот проверочный код
#include <SPI.h> #include <SD.h> #define SD_CS 10 // порт управления SD картой uint8_t buf[5] = {49, 50, 51, 52, 53 }; // Buffer to store in file File dataFile; char* filename="reestr.csv"; void setup() { Serial.begin(115200); Serial.println(F("Hello!")); pinMode(SD_CS, OUTPUT); digitalWrite(SD_CS,HIGH); if (!SD.begin(SD_CS)) { Serial.print(F("SD card error")); return; } if (SD.exists(filename)) { SD.remove(filename); } if (SD.exists(filename)) { Serial.print(filename); Serial.println(F(" found")); } else { Serial.print(filename); Serial.println(F(" not found")); dataFile = SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.println(F("test")); dataFile.close(); } } //********************************************************************************* Serial.write(buf,5); Serial.println(); dataFile = SD.open(filename, FILE_WRITE); Serial.println(dataFile.position()); dataFile.seek(0); Serial.println(dataFile.position()); if (dataFile) { dataFile.write(buf,5); dataFile.close(); } for (int i=0;i<5;i++){buf[i]=48;} Serial.write(buf,5); Serial.println(); dataFile = SD.open(filename, FILE_READ); Serial.println(dataFile.position()); dataFile.seek(0); Serial.println(dataFile.position()); if (dataFile) { dataFile.read(buf,5); dataFile.close(); } Serial.write(buf,5); Serial.println(); dataFile = SD.open(filename, FILE_READ); Serial.println(dataFile.position()); dataFile.seek(6); Serial.println(dataFile.position()); if (dataFile) { dataFile.read(buf,5); dataFile.close(); } Serial.write(buf,5); Serial.println(); } void loop() { // put your main code here, to run repeatedly: }результат его работы
то есть независимо от указанного в 41 строке .seek(0) , оно в 45 строке пишет буфер в конец файла
, а мне хочется писать в произвольную позицию
или я гдетто недопонимаю ?
такое ощущение, что seek влияет только на read, а write всегда происходит в конец файла
Так и должно быть.
seek меняет только позицию чтения, а позиция записи от seek() не зависит. Позиция записи зависит от режима. В APPEND и WRITE запись всегда идет в конец файла, в TRUNCATE - в начало. Чтобы писать в произвольное место файла. надо открывать файл не во WRITE, а в режиме Read-Write
Ага, значит мои подозрения небеспочвенны :)
На режим read-write не нашел ничего, в кейвордс также только read и write
также не удается указать в опен READ_WRITE
Где бы почитать более полное описание библиотеки?
А не найдется ли у Вас примера кода, пишущего в произвольное место?
или ссылки на оный...
http://www.c-cpp.ru/content/open-rtlopen
Примеры использования есть тут - только кода много. Смотрите Fileserver.ino
https://github.com/stardot/ArduinoFilestore/tree/master/EconetServer
Пока смотрел и искал Вы ответили :) а я уже пишу
И все равно спасибо.
сработало!
в 39 строке указал вместо FILE_WRITE O_RDWR, подсмотренное в SdFat.h в 61 строке.
Весь остальной код неизменный.
результат