0

我参与了一个项目,我需要从“csv”文件中读取数据,然后我需要将此信息存储在字符串数组中,以便在存储后搜索、写入、删除和添加信息。我从“csv”文件处理的字段是:

身份证、姓名、金额:

1234 马里奥 $100
3245 弗朗西斯科 $15.50
4356 Jorge $0.00
4321 Pablo $0.00
2346 Rene $0.00
8795 Sofia $233.20 3569
Sandra $0.00
8907 Andrea $0.00
6890 Maru $0.00
4563 安娜 $ 0.02 $0.02 最终 678.

问题是当我创建字符串数组时,总是在索引指向的当前单元格中写入(什么是正确的)但也覆盖以前的单元格(什么是不正确的),例如:

步骤 0:
cell0:1234 马里奥 $100

step1:单元格0:3245
弗朗西斯科 $15.50
单元格1:3245 弗朗西斯科 $15.50

步骤 3:细胞 0:4356 豪尔赫 0.00 美元 细胞 1:4356 豪尔赫 0.00 美元细胞
2 :4356 豪尔赫 0.00 美元

等等...

正如您最后可以推断的那样,我拥有所有字符串数组的单元格以及最后的信息,6789 Noemi 23.12 美元,但没有正确的信息。代码是:

#include <SD.h>

//Ajustes SPI
//MOSI, MISO, SCLK estan predeterminados
int CS_pin=8;

char in_char=0;
String datosSD="";

int x=0;
char myStrings[60];
char* arrayStrings[13];  

void setup()
{
Serial.begin(9600);    //Se inicializa velocidad de comunicación serial
Serial.println("Inicializando microSD");

pinMode(CS_pin,OUTPUT);  //Se configura Pin CS (8) como salida

  //Se verifica si la tarjeta esta lista
  if(!SD.begin(CS_pin))
  {
    Serial.println("Fallo microSD");
    return;
  }
   Serial.println("miscroSD lista");

  //Se abre un archivo para escribir en el
  //Solo un archivo se puede abrir a la vez
  File datoArchivo=SD.open("TEST.csv");
  in_char=datoArchivo.read();

//Se verifica si la apertura del archivo tuvo éxito para poder escribir en el archivo
if(datoArchivo)
{ 
    while(datoArchivo.available())
    {
      if(in_char!='\n')
      {
        datosSD.concat(in_char);
        in_char = datoArchivo.read();
      }
      else
         {
           Serial.println(datosSD);              
           datosSD.toCharArray(myStrings, 60);  
           arrayStrings[x]=myStrings;
           x++;

             in_char = datoArchivo.read();
             datosSD="";
       }  
    } 
   datoArchivo.close(); 
}
else
  {
    Serial.println("No se pudo Accesar al Archivo");
  } 
/////////// Show the information of Array of Strings /////////////////    
 for (int i = 0; i < 13; i++)
 {
  Serial.println(arrayStrings[i]);
  delay(100);
 }
//////////////////////////////////////////////////////////////////////    
}

void loop()
{ 
}  

先感谢您

4

2 回答 2

0

您只分配了一个字符串,而不是您认为的 13 个。这将创建您需要的 char 指针数组:

char* arrayStrings[13];  

但这些只是指针,而不是字符串本身。您只有其中之一,即实际字符串:

char myStrings[60];

您不断重复使用该字符串从文件中读取。您将所有指针数组分配给同一个字符串:

arrayStrings[x]=myStrings;

因此,当您遍历指针列表并打印它们时,您会得到从文件中读取的最后一个字符串。如果您打印实际的指针值,这将变得清晰。试试这个,并记下你看到的:

Serial.println( (int)(arrayStrings[i]) );

要完成这项工作,您需要为要保留在内存中的所有字符串分配内存。

这就是这成为一个很好的学习问题的地方。尝试对内存中的此数据集执行任何操作时,您将消耗几乎一半的可用 RAM。添加更多数据或对数据操作的复杂性,您将无法在 RAM 中保存所有内容的情况下对数据执行操作。这将变成一个问题,如何将所有数据保存在磁盘(SD 卡)上,并在内存中进行少量操作,类似于数据库的操作方式。

于 2013-07-30T08:15:51.050 回答
0

尝试使用 String mystrings[] 代替,它对我来说效果很好,尽管它不像 jdr5ca 的答案那样有效。但是,由于他可能是对的,并且您一次只能阅读部分内容,因此这不成问题。 如果您需要额外的数据存储,请查看http://arduino.cc/en/Reference/StringObject 以获取使用 String 的帮助和 http://arduino.cc/en/Reference/String以获取更多信息。

于 2013-07-31T02:24:40.077 回答