试试这样
#include #include #include unsigned long fileLength = 0; //文件长度
unsigned long poipos = 0; //文件指针位置
File file;
String matchPinyin(String);
String search(String, unsigned long, unsigned long, File &);
void setup()
{
Serial.begin(115200);
Serial.println(SD.begin(SPI_HALF_SPEED, 4));
file = SD.open("1.txt", FILE_READ);
fileLength = file.available();
file.close();
Serial.println("汉字");
Serial.println(matchPinyin("a "));
Serial.println(matchPinyin("zuo "));
Serial.println(matchPinyin("hao "));
Serial.println("done");
}
String matchPinyin(String val)
{
file = SD.open("1.txt", FILE_READ);
return search(val, 0, fileLength, file);
}
String search(String val, unsigned long a, unsigned long b, File &file)
{
char word = 0; //缓存所取
int sub = 0; //比较下标
unsigned long mid = a / 2 + b / 2;
Serial.print(a);
Serial.print(",");
Serial.print(b);
Serial.print(":");
Serial.println(mid);
if ((b - a) < 2)
{
return "";
}
file.seek(mid);
while (file.peek() != 10)
{
mid--;
file.seek(mid);
}
poipos = mid;
while (file.peek() != 9)
{
file.seek(++poipos);
}
while ((file.seek(++poipos), (word = file.peek())) != '\r')
{
if (val[sub] == word)
{
sub++;
}
else if (word > val[sub])
{
Serial.println("front");
yield();
file.close();
return (search(val, a, (a + b) / 2, file));
}
else if (word < val[sub])
{
Serial.println("back");
yield();
file.close();
return (search(val, (a + b) / 2, b, file));
}
}
String ret = "";
file.seek(++mid);
while (file.peek() != 9)
{
ret += char(file.read());
}
return ret;
}
void loop()
{
}
开在边缘回复operator
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println(SD.begin(SPI_HALF_SPEED, 4));
File file=SD.open("1.txt",FILE_READ);
String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数
{
char word=0;//缓存所取
int sub=0;//比较下标
File file=SD.open("1.txt",FILE_READ);
因为你在函数里面又重新定义了一次file,所以函数里面的file就变成了函数内部的局部变量,不再是你之前定义的那个全局变量了。
#include
#include
#include
unsigned long fileLength = 0; //文件长度
unsigned long poipos = 0; //文件指针位置
File file;
String matchPinyin(String);
String search(String, unsigned long, unsigned long, File &);
void setup()
{
Serial.begin(115200);
Serial.println(SD.begin(SPI_HALF_SPEED, 4));
file = SD.open("1.txt", FILE_READ);
fileLength = file.available();
file.close();
Serial.println("汉字");
Serial.println(matchPinyin("a "));
Serial.println(matchPinyin("zuo "));
Serial.println(matchPinyin("hao "));
Serial.println("done");
}
String matchPinyin(String val)
{
file = SD.open("1.txt", FILE_READ);
return search(val, 0, fileLength, file);
}
String search(String val, unsigned long a, unsigned long b, File &file)
{
char word = 0; //缓存所取
int sub = 0; //比较下标
unsigned long mid = a / 2 + b / 2;
Serial.print(a);
Serial.print(",");
Serial.print(b);
Serial.print(":");
Serial.println(mid);
if ((b - a) < 2)
{
return "";
}
file.seek(mid);
while (file.peek() != 10)
{
mid--;
file.seek(mid);
}
poipos = mid;
while (file.peek() != 9)
{
file.seek(++poipos);
}
while ((file.seek(++poipos), (word = file.peek())) != '\r')
{
if (val[sub] == word)
{
sub++;
}
else if (word > val[sub])
{
Serial.println("front");
yield();
file.close();
return (search(val, a, (a + b) / 2, file));
}
else if (word < val[sub])
{
Serial.println("back");
yield();
file.close();
return (search(val, (a + b) / 2, b, file));
}
}
String ret = "";
file.seek(++mid);
while (file.peek() != 9)
{
ret += char(file.read());
}
return ret;
}
void loop()
{
}
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println(SD.begin(SPI_HALF_SPEED, 4));
File file=SD.open("1.txt",FILE_READ);
String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数
{
char word=0;//缓存所取
int sub=0;//比较下标
File file=SD.open("1.txt",FILE_READ);
因为你在函数里面又重新定义了一次file,所以函数里面的file就变成了函数内部的局部变量,不再是你之前定义的那个全局变量了。