вопрос по библиотеке SD

inspiritus
Offline
Зарегистрирован: 17.12.2012

Кратко

такое ощущение, что seek влияет только на read, а write всегда происходит в конец файла

inspiritus
Offline
Зарегистрирован: 17.12.2012

ДОброго времени суток Уважаемые коллеги, не сочтите за труд посмотреть...

написал такой вот проверочный код

 #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:

}

результат его работы

Hello!
reestr.csv not found
12345
6
0
00000
0
0
test

0
6
12345

то есть независимо от указанного в 41 строке .seek(0)  , оно в 45 строке пишет буфер в конец файла

, а мне хочется писать в произвольную позицию

или я гдетто недопонимаю ?

b707
Offline
Зарегистрирован: 26.05.2017

inspiritus пишет:

такое ощущение, что seek влияет только на read, а write всегда происходит в конец файла

Так и должно быть.

seek меняет только позицию чтения, а позиция записи от seek() не зависит. Позиция записи зависит от режима. В APPEND и WRITE запись  всегда идет в конец файла, в TRUNCATE - в начало. Чтобы писать в произвольное место файла. надо открывать файл не во WRITE, а в режиме Read-Write

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ага, значит мои подозрения небеспочвенны :)

На режим read-write не нашел ничего, в кейвордс также только read и write

также не удается указать в опен READ_WRITE

Где бы почитать более полное описание библиотеки?

А не найдется ли у Вас примера кода, пишущего в произвольное место?

или ссылки на оный...

 

b707
Offline
Зарегистрирован: 26.05.2017
file.open(filename, O_RDWR);
file.seekSet(0);
file.write(buffer, buf_len);

 

http://www.c-cpp.ru/content/open-rtlopen

 

b707
Offline
Зарегистрирован: 26.05.2017

Примеры использования есть тут - только кода много. Смотрите Fileserver.ino

https://github.com/stardot/ArduinoFilestore/tree/master/EconetServer

inspiritus
Offline
Зарегистрирован: 17.12.2012

Пока смотрел и искал Вы ответили :) а я уже пишу 

И все равно спасибо.

сработало!

в 39 строке указал вместо FILE_WRITE   O_RDWR, подсмотренное в SdFat.h в 61 строке.

Весь остальной код неизменный. 

результат

Hello!
reestr.csv not found
12345
0
0
00000
0
0
12345
0
6
12345