Я довольно новичок в бизнесе Arduino. Как мне прочитать последнюю строку с SD-карты? С помощью следующего фрагмента кода я могу прочитать первую строку (все символы перед «\ n»). Теперь я хотел бы включить «обратное» утверждение (или что-то).
Мой код до сих пор:
#include <SD.h>
#include <SPI.h>
File SD_File;
int pinCS = 10;
char cr;void setup() {
Serial.begin(9600);
SD.begin();
SD_File = SD.open("test.txt", FILE_WRITE);
SD_File.println("hello");
SD_File.close();
SD_File = SD.open("test.txt");
while(true){
cr = SD_File.read();
if((cr == '\n') && ("LAST LINE?"))
break;
Serial.print(cr);
}
SD_File.close();
}
void loop() {
}
Ваша помощь очень ценится.
Поскольку вы технически открываете текстовые файлы, вы можете использовать seekg, чтобы перейти к концу файла и прочитать последнюю строку, как описано в этом разделе. ответ.
Если это не поможет, добавьте немного контекста и пример файла, который поможет нам лучше понять ваш вопрос.
Я не уверен, что понял ваш вопрос.
seekg
?» Нет seekg
. Однако есть seek
.File
методы класса (seek
среди прочих).SD_File.seek( SD_File.size() );
Если вы хотите прочитать последнюю строку, самый простой способ — написать getline
функции и читать весь файл построчно до конца. Если предположить, MAX_LINE
является достаточно большой а также getline
возвращает ноль в случае успеха://...
char s[ MAX_LINE ];
while ( getline( f, s, MAX_LINE , '\n' ) == 0 )
;
// when reaching this point, s contains the last line
Serial.print( "This is the last line: " );
Serial.print( s );
Вот getline
идея (без гарантии — не проверено):
/*
s - destination
count - maximum number of characters to write to s, including the null terminator. If
the limit is reached, it returns -2.
delim - delimiting character ('\n' in your case)
returns:
0 - no error
-1 - eof reached
-2 - full buffer
*/
int getline( File& f, char* s, int count, char delim )
{
int ccount = 0;
int result = 0;
if ( 0 < count )
while ( 1 )
{
char c = f.peek();
if ( c == -1 )
{
f.read(); // extract
result = -1;
break; // eof reached
}
else if ( c == delim )
{
f.read(); // extract
++ccount;
break; // eol reached
}
else if ( --count <= 0 )
{
result = -2;
break; // end of buffer reached
}
else
{
f.read(); // extract
*s++ = c;
++ccount;
}
}
*s = '\0'; // end of string
return ccount == 0 ? -1 : result;
}