c++ 逐行读取文件并存储为字符串,Flash数据保存SPIFFS

vxbzzdmp  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(195)

我正在做一个用Flash数据保存的项目。我使用的是SPIFFS库的ESP32,我目前正在尝试将每一行的数据存储到字符串中。因为我可以控制文件中的内容数量,所以存储数据的字符串不需要超过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();
}

我用这个函数把代码写进File:

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

w8f9ii691#

使用vector会更简单:

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

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

jdg4fx2g

jdg4fx2g2#

我可以让它像这样工作:

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

相关问题