|
想做一个从SD卡里的文件用拼音查询汉字的程序,但是File file=SD.open("1.txt",FILE_READ); 这一句只能写到递归函数里,写到初始化里在递归函数里就不能操作文件了,是什么情况?怎么改进呢?
以下是全部代码: - #include<SD.h>
- #include<SPI.h>
- #include<String.h>
- unsigned long fileLength=0;//文件长度
- unsigned long poipos=0;//文件指针位置
- File file;
- String matchPinyin(String);
- String search(String,unsigned long,unsigned long);
- 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);
- 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)
- {
- return search(val,0,fileLength);
- }
- String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数
- {
- char word=0;//缓存所取
- int sub=0;//比较下标
- File file=SD.open("1.txt",FILE_READ);
- 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 "";
- }
- //Serial.println("front find");
- file.seek(mid);
- while(file.peek()!=10/*不是换行*/)//连续向上查询
- {
- /*Serial.print(" ");
- Serial.print(mid);
- Serial.print(" ");
- Serial.println(file.peek());*/
- mid--;
- file.seek(mid);
- }
- //Serial.println("back find");
- poipos=mid;
- while(file.peek()!=9/*不是空格*/)//连续向下查询
- {
- /*Serial.print(" ");
- Serial.print(file.peek());
- Serial.print(" ");
- Serial.println(char(file.peek()));*/
- file.seek(++poipos);
- }
- while(file.seek(++poipos),(word=file.peek())!='\r'/*不是回车*/)//依次比较
- {
- /*Serial.print(" ");
- Serial.print(char(val[sub]));
- Serial.print("==");
- Serial.print(char(word));*/
- if(val[sub]==word)
- {
- sub++;
- }
- else if(word>val[sub])//从前寻找
- {
- Serial.println("front");
- yield();
- file.close();
- return(search(val,a,(a+b)/2));
- }
- else if(word<val[sub])//从后寻找
- {
- Serial.println("back");
- yield();
- file.close();
- return(search(val,(a+b)/2,b));
- }
- }
- //此次选择正确
- String ret="";
- file.seek(++mid);
- while(file.peek()!=9)
- {
- ret+=char(file.read());
- }
- file.close();
- return ret;
- }
- void loop() {
- // put your main code here, to run repeatedly:
-
- }
-
复制代码
以下是代码高亮的图片,和需要打开的文件:
|
|