我参与了一个项目,我需要从“csv”文件读取数据,然后我需要将这些信息存储在一个字符串数组中,以便在存储后搜索,写入,删除和添加信息。我从“csv”文件处理的字段是:
ID,姓名,金额:
1234马里奥100美元 3245 Francisco $ 15.50问题是当我创建字符串数组时,总是写入索引指向的当前单元格(正确)但是也覆盖前面的单元格(不正确),例如:
步骤0:
cell0:1234 Mario $ 100
步骤1:
cell0:3245 Francisco $ 15.50
cell1:3245 Francisco $ 15.50
步骤3:
cell0:4356 Jorge $ 0.00
cell1:4356 Jorge $ 0.00
cell2:4356 Jorge $ 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()
{
}
提前谢谢
答案 0 :(得分:0)
您只分配了一个字符串,而不是您认为的13个字符串。这将创建您需要的char指针数组:
char* arrayStrings[13];
但那些只是指针,而不是字符串本身。您只有其中一个,这是实际的字符串:
char myStrings[60];
您不断重复使用该字符串从文件中读取。您将所有指针数组分配给同一个字符串:
arrayStrings[x]=myStrings;
因此,当您遍历指针列表并打印它们时,您将获得从文件中读取的最后一个字符串。如果你打印了实际指针值,这将变得清晰。试试这个,记下你看到的内容:
Serial.println( (int)(arrayStrings[i]) );
要使其工作,您需要为要保留在内存中的所有字符串分配内存。
这就是这成为一个优秀的学习问题。您将消耗几乎一半的可用RAM,尝试对内存中的此数据集执行任何操作。在数据上添加更多数据或操作的复杂性,您将无法使用RAM中保存的所有内容对数据执行操作。这将变成一个问题,即如何将所有数据保存在磁盘(SD卡)上,并在内存中执行少量操作,类似于数据库的操作方式。
答案 1 :(得分:0)
尝试使用String mystrings []代替它,它对我来说效果很好,虽然它不像jdr5ca的答案那样具有内存效率。但是,由于他可能是正确的,而且你一次只能阅读作品,这应该不是问题。看看http://arduino.cc/en/Reference/StringObject 有关使用String和的帮助 http://arduino.cc/en/Reference/String 如果您需要额外的数据存储,请获取更多信息。