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

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

我正在做一个用Flash数据保存的项目。我使用的是SPIFFS库的ESP32,我目前正在尝试将每一行的数据存储到字符串中。因为我可以控制文件中的内容数量,所以存储数据的字符串不需要超过3个。我可以很容易地管理使用readStringUntil存储第一行内容。但是我不能设法从2和3行得到内容。
对于第一行,我使用的代码如下:

  1. //Pegar a primeira linha do arquivo, onde será armazenado o nome do WIFI (ssid)
  2. void first_line (){
  3. file = SPIFFS.open("/wifi.txt", "r");
  4. while (file.available()) {
  5. String first_line = file.readStringUntil('\n');
  6. Serial.print(first_line);
  7. break;
  8. }
  9. file.close();
  10. }

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

  1. // Escrever mensagem dentro do arquivo
  2. void write_file_info(String message) {
  3. file = SPIFFS.open("/wifi.txt", FILE_WRITE);
  4. if (!file){
  5. Serial.println("Error opening file");
  6. return;
  7. }else{
  8. Serial.println("Success opening file");
  9. }
  10. if (file.println(message)){
  11. Serial.println("File was written");
  12. }else{
  13. Serial.println("File was not written");
  14. }
  15. file.close();
  16. }

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

  1. void append_file_info (String message){
  2. file = SPIFFS.open("/wifi.txt", FILE_APPEND);
  3. if (!file){
  4. Serial.println("Erro ao realizar APPEND ao arquivo");
  5. }
  6. if (file.println(message)){
  7. Serial.println("File was added");
  8. }else{
  9. Serial.println("File was not added");
  10. }
  11. file.close();
  12. }

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

  1. File size: 37
  2. Content inside file:
  3. first line
  4. second line
  5. thrid line

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

  1. void read_file_info() {
  2. file = SPIFFS.open("/wifi.txt");
  3. Serial.print("\nFile size: ");
  4. Serial.println(file.size());
  5. Serial.print("Content inside file: \n");
  6. while (file.available()){
  7. Serial.write(file.read());
  8. }
  9. Serial.println("\n");
  10. file.close();
  11. delay(3000);
  12. }

我想尝试读取'\n'后面的数据,但找不到任何关于阅读某个字符串后面的文档。
我试着创建一个缓冲区并稍后将其拆分,缓冲区的输出是正确的,但我不能正确地将其拆分成字符串:

  1. void second_line (){
  2. file = SPIFFS.open("/wifi.txt", "r");
  3. char buffer[64];
  4. while (file.available()) {
  5. int l = file.readBytesUntil('\n', buffer, sizeof(buffer));
  6. buffer[l] = 0;
  7. Serial.println(buffer);
  8. }
  9. file.close();
  10. }
w8f9ii69

w8f9ii691#

使用vector会更简单:

  1. #include <SPIFFS.h>
  2. using namespace std;
  3. void setup() {
  4. Serial.begin(115200);
  5. if (!SPIFFS.begin(true)) {
  6. Serial.println("An Error has occurred while mounting SPIFFS");
  7. return;
  8. }
  9. File file = SPIFFS.open("/wifi.txt", "r");
  10. if (!file) {
  11. Serial.println("Failed to open file for reading");
  12. return;
  13. }
  14. vector<String> v;
  15. while (file.available()) {
  16. v.push_back(file.readStringUntil('\n'));
  17. }
  18. file.close();
  19. for (String s : v) {
  20. Serial.println(s);
  21. }
  22. }
  23. void loop() {}

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

展开查看全部
jdg4fx2g

jdg4fx2g2#

我可以让它像这样工作:

  1. void all_lines (){
  2. file = SPIFFS.open("/wifi.txt", "r");
  3. int i = 0;
  4. char buffer[64];
  5. String line_one, line_two, line_three;
  6. while (file.available()) {
  7. int l = file.readBytesUntil('\n', buffer, sizeof(buffer));
  8. buffer[l] = 0;
  9. if (i == 0) {
  10. line_one = buffer;
  11. }
  12. if (i == 1) {
  13. line_two = buffer;
  14. }
  15. if (i == 2) {
  16. line_three = buffer;
  17. }
  18. i++;
  19. if (i == 3){
  20. break;
  21. }
  22. }
  23. file.close();
  24. }
展开查看全部

相关问题