逐行读取文件并存入字符串,Flash数据保存SPIFFS

Nil*_*r F 3 c++ arduino arduino-c++ esp32

我正在开发一个使用 Flash 数据保存的项目。我正在使用 ESP32 的 SPIFFS 库,目前正在尝试将每行的数据存储到字符串中。由于我可以控制文件中可以包含多少内容,因此不需要超过 3 个字符串来存储数据。我可以轻松地使用 来存储第一行内容readStringUntil。但我无法从第 2 行和第 3 行获取内容。

\n对于第一行,我使用以下代码:

\n
//Pegar a primeira linha do arquivo, onde ser\xc3\xa1 armazenado o nome do WIFI (ssid)\nvoid first_line (){\n  file = SPIFFS.open("/wifi.txt", "r");\n\n  while (file.available()) {\n    String first_line = file.readStringUntil('\\n');\n    Serial.print(first_line);\n    break;\n  }\n\n  file.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我使用此函数将代码写入文件:

\n
// Escrever mensagem dentro do arquivo\nvoid write_file_info(String message) {\n  file = SPIFFS.open("/wifi.txt", FILE_WRITE);\n\n  if (!file){\n    Serial.println("Error opening file");\n    return;\n  }else{\n    Serial.println("Success opening file");\n  }\n\n  if (file.println(message)){\n    Serial.println("File was written");\n  }else{\n    Serial.println("File was not written");\n  }\n\n  file.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我使用 Append 添加第二行和第三行:

\n
void append_file_info (String message){\n  file = SPIFFS.open("/wifi.txt", FILE_APPEND);\n\n  if (!file){\n    Serial.println("Erro ao realizar APPEND ao arquivo");\n  }\n\n  if (file.println(message)){\n    Serial.println("File was added");\n  }else{\n    Serial.println("File was not added");\n  }\n\n  file.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是当前的输出,文件大小仅供管理,“文件内内容”仅供参考:

\n
File size: 37\nContent inside file: \nfirst line\nsecond line\nthrid line\n
Run Code Online (Sandbox Code Playgroud)\n

这就是我读取文件的方式:

\n
void read_file_info() {\n  file = SPIFFS.open("/wifi.txt");\n\n  Serial.print("\\nFile size: ");\n  Serial.println(file.size());\n\n  Serial.print("Content inside file: \\n");\n  while (file.available()){\n    Serial.write(file.read());\n  }\n\n  Serial.println("\\n");\n\n  file.close();\n  delay(3000);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我想过尝试读取“\\n”之后的数据,但找不到任何有关读取特定字符串之后的文档。
\n我尝试创建一个缓冲区并稍后将其分割,缓冲区的输出是正确的,但我无法正确地将其分割为字符串:

\n
void second_line (){\n  file = SPIFFS.open("/wifi.txt", "r");\n  \n  char buffer[64];\n  while (file.available()) {\n   int l = file.readBytesUntil('\\n', buffer, sizeof(buffer));\n   buffer[l] = 0;\n   Serial.println(buffer);\n  }\n\n  file.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Wac*_*ilo 9

使用向量会更简单:

#include <SPIFFS.h>

using namespace std;

void setup() {
  Serial.begin(115200);

  if (!SPIFFS.begin(true)) {
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  File file = SPIFFS.open("/wifi.txt", "r");
  if (!file) {
    Serial.println("Failed to open file for reading");
    return;
  }

  vector<String> v;
  while (file.available()) {
    v.push_back(file.readStringUntil('\n'));
  }
  file.close();

  for (String s : v) {
    Serial.println(s);
  }
}

void loop() {}
Run Code Online (Sandbox Code Playgroud)

用于v[0]获取第一行、v[1]第二行、v[2]第三行等等。