微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在处理一个具有 Flash 数据保存功能的项目。我正在为 ESP32 使用 SPIFFS 库,我目前正在尝试将每一行的数据存储到一个字符串中。由于我可以控制可以进入文件内容数量,因此存储数据不需要超过 3 个字符串。我可以轻松地使用 readStringUntil 存储第一行内容。但是我无法从第 2 行和第 3 行获取内容

对于第一行,我使用此代码

//Pegar a primeira linha do arquivo,onde será armazenado o nome do WIFI (ssid)
void first_line (){
  file = SPIFFS.open("/wifi.txt","r");

  while (file.available()) {
    String first_line = file.readStringUntil('\n');
    Serial.print(first_line);
    break;
  }

  file.close();
}

我正在使用此函数代码写入文件

// Escrever mensagem dentro do arquivo
void write_file_info(String message) {
  file = SPIFFS.open("/wifi.txt",FILE_WRITE);

  if (!file){
    Serial.println("Error opening file");
    return;
  }else{
    Serial.println("Success opening file");
  }

  if (file.println(message)){
    Serial.println("File was written");
  }else{
    Serial.println("File was not written");
  }

  file.close();
}

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

void append_file_info (String message){
  file = SPIFFS.open("/wifi.txt",FILE_APPEND);

  if (!file){
    Serial.println("Erro ao realizar APPEND ao arquivo");
  }

  if (file.println(message)){
    Serial.println("File was added");
  }else{
    Serial.println("File was not added");
  }

  file.close();
}

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

File size: 37
Content inside file: 
first line
second line
thrid line

这是我阅读文件的方式:

void read_file_info() {
  file = SPIFFS.open("/wifi.txt");

  Serial.print("\nFile size: ");
  Serial.println(file.size());

  Serial.print("Content inside file: \n");
  while (file.available()){
    Serial.write(file.read());
  }

  Serial.println("\n");

  file.close();
  delay(3000);
}

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

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

  file.close();
}

解决方法

我可以设法让它像这样工作:

void all_lines (){
  file = SPIFFS.open("/wifi.txt","r");
  
  int i = 0;
  char buffer[64];
  String line_one,line_two,line_three;
  
  while (file.available()) {
   int l = file.readBytesUntil('\n',buffer,sizeof(buffer));
   buffer[l] = 0;
   if (i == 0) {
    line_one = buffer;
   }
   if (i == 1) {
    line_two = buffer;
   }
   if (i == 2) {
    line_three = buffer;
   }
   i++;

   if (i == 3){
    break;
   }
   
  }

  file.close();
}
,

使用向量会更简单:

#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");
  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() {}

使用 v[0] 获取第一行,v[1] 获取第二行,v[2] 获取第三行,依此类推。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。