Arduino从SD卡读取最后一行

时间:2018-06-26 12:54:44

标签: c++ arduino sd-card

我对Arduino业务很陌生。如何从SD卡读取最后一行?使用以下代码片段,我可以读取第一行(“ \ n”之前的所有字符)。现在,我想添加一个“向后”声明(或其他内容)。

到目前为止,我的代码:

xml

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

从技术上来说,由于您正在打开文本文件,因此可以按照此answer中的说明使用seekg跳到文件末尾并读取最后一行。

如果这没有帮助,添加更多上下文和示例文件将帮助我们更好地理解您的问题。

答案 1 :(得分:0)

我不确定我是否理解你的问题。

  • “如何实现seekg?” 没有seekg。但是,有一个seek
  • This是SD库的文档页面。页面的右侧是所有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;
}