Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FatFileSystemCpp
Diff: usbMemory.cpp
- Revision:
- 9:280ae971e7cb
- Parent:
- 8:6e23bf867e38
- Child:
- 10:cce9366e2d73
--- a/usbMemory.cpp Sun Dec 18 08:29:59 2016 +0000
+++ b/usbMemory.cpp Sun Oct 14 09:39:45 2018 +0000
@@ -101,7 +101,7 @@
if ( fp != NULL ) {
char buf[256];
while ( NULL != fgets(buf, sizeof(buf), fp) ) {
- DEBUG_PRINT("%s", buf);
+ // DEBUG_PRINT("%s", buf);
numMax++;
}
*numberLine = numMax;
@@ -122,16 +122,75 @@
* @param dataNumber : *dataのbyte数
* @param numberLine : 取得する行数
* @return false:失敗 true:成功
+ *
+ * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする
*/
uint32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine)
{
// static FILE *fp;
+ uint32_t i;
int32_t ans = false;
+
+#define tempNumber 600
+#define tempSize 30
+ static char temp[tempNumber][tempSize]; // tempNumber行分のデータをバッファしておく
+ static uint32_t tempLineStartNo = 0; // tempの先頭行番号
+ static int32_t tempCheck = -1; // tempにデータがあるか判別 -1:なし それ以外あり
+
#define bufferNumber 100
char buffer[bufferNumber];
- sprintf(buffer,"/msc/%s",fileName);
+
+
+ if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)){
+ // tempにデータがあればそこから取り出す
+ strcpy(data, &temp[numberLine % tempNumber][0]);
+ ans = true;
+ DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber));
+ }
+ else{
+ // tempにデータがなければUSBから取り出し、tempにも保存する
+ sprintf(buffer,"/msc/%s",fileName);
+ fp = fopen( buffer, "r");
+ if ( fp != NULL ) {
+ tempLineStartNo = (numberLine /tempNumber) * tempNumber;
+
+ // 目的の行まで空回し
+ for(i = 0; i < ((numberLine / tempNumber) * tempNumber) ; i++) {
+ fgets(buffer, sizeof(buffer), fp);
+ }
+ // 目的の行からtempに保管していく
+ for(i = 0; i < tempNumber ; i++) {
+ if(NULL != fgets(&temp[i][0], tempSize, fp)){
+ tempCheck = 1;
+ }
+ else {
+ // fileにデータがなければ強制終了
+ break;
+ //i = tempNumber;
+ }
+ }
+
+ // fileから取り出した回もtempからデータを取得
+ if((numberLine % tempNumber) <= i){
+ strcpy(data, &temp[numberLine % tempNumber][0]);
+ ans = true;
+ DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber);
+ }
+ else{
+ // nothing
+ }
+
+ } else {
+ // Don't file open
+ // nothing
+ }
+ fclose(fp);
+
+ }
+
+/* 181014変更前
fp = fopen( buffer, "r");
if ( fp != NULL ) {
for(uint32_t i = 0; i < numberLine; i++) {
@@ -150,6 +209,8 @@
}
fclose(fp);
+181014変更前 */
+
return ans;
}