【问题标题】:Read line by line in file and store into string, Flash data saving SPIFFS在文件中逐行读取并存储到字符串中,Flash 数据保存 SPIFFS
【发布时间】:2021-01-07 23:55:34
【问题描述】:

我正在处理一个使用 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();
}

【问题讨论】:

    标签: c++ arduino esp32 arduino-c++


    【解决方案1】:

    使用矢量会更简单:

    #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] 获取第三行,依此类推。

    【讨论】:

    • 我最喜欢的解决方案。会将这个标记为已解决:D
    • 也在我的项目中工作过。我需要更改 for (String s : v) { Serial.println(s); 的最后部分} 到 Serial.println(v[*hour]);现在看起来还可以
    • 但是如何获取分隔符后的最后一条数据呢?因为我的 csv 文件是月、日、小时、值。如何获取最后一列的值?
    • @Samuel readStringUntil() 将返回缓冲区包含的任何内容,如果它没有找到字符。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多