bool CCSVOperator::LoadCSV(CString path) { int wLen = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);//得到Char的长度 char *str = new char[wLen + 1]; //分配变量的地址大小 WideCharToMultiByte(CP_ACP, 0, path, -1, str, wLen, NULL, NULL); //将CString转换成char* LoadCSV(str); return true; }
// Get all possible ids from the IDE files CIDE* LoadIDE(const char *filename) { CCSV *csv = LoadCSV(filename); if (!csv) return NULL; return new CIDE(csv); }
////////////////////////////////////////////////////////////////////////// //CSV operator CCSVOperator::CCSVOperator(const char* path) { LoadCSV(path); }
int LoadFile(char *fname) { kosFileInfo fileInfo; kosBDVK bdvk; int filePointer = 0, i, j; Dword res, filesize; char buffer[512 + 1]; char *d, *s, *k; int step = 0, items; if (str_is_csv(fname)) return LoadCSV(fname); //rtlDebugOutString(fname); strcpy(fileInfo.fileURL,fname); fileInfo.OffsetLow = 0; fileInfo.OffsetHigh = 0; fileInfo.rwMode = 5; fileInfo.bufferPtr = (Byte *)&bdvk; Dword rr = kos_FileSystemAccess(&fileInfo); // в CKosFile нет определения размера //sprintf(debuf, "getsize: %U\n", rr); //rtlDebugOutString(debuf); if (rr != 0) { return -1; } // clear the table reinit(); //rtlDebugOutString("clear done"); filesize = bdvk.size_low; fileInfo.rwMode = 0; fileInfo.dataCount = strlen(sFileSign); fileInfo.bufferPtr = (Byte*)buffer; kos_FileSystemAccess(&fileInfo); s = (char*)sFileSign; d = buffer; while (*s && *d && *s++==*d++); // застрелите меня if (*s != '\0' || *d != '\0') { return -2; } fileInfo.OffsetLow += fileInfo.dataCount; items = 1; while (fileInfo.OffsetLow < filesize) { // так прочитали ли мы ширину всех стоблцов, и длину всех строк прочитали ли мы? fileInfo.dataCount = 512; memset((Byte*)buffer, 0, 512); kos_FileSystemAccess(&fileInfo); //sprintf(debuf, "%U", fileInfo.OffsetLow); //rtlDebugOutString(debuf); //sprintf(debuf, "buffer: %S", buffer); //rtlDebugOutString(debuf); // что я увижу на доске отладки // то мне поможет в жизненном пути // смогу тогда своей ошибки гадкой // причину непосредственно найти switch (step) { case 0: // стоблцы d = buffer; while (*d && *d != ',' && *d != '\n') d++; //d--; if (!*d) { return -2; } *d = '\0'; i = atoi(buffer); col_width[items++] = i; if (items == col_count) { step++; items = 1; // теперь высоты строк читать мы будем смело // чтоб их восстановить и было как всегда //sprintf(debuf, "cols read done last buf %S file pos %U",buffer,fileInfo.OffsetLow); //rtlDebugOutString(debuf); } d+=2; break; case 1: // строки, коих высота записана d = buffer; while (*d && *d != ',' && *d != '\n') d++; //d--; if (!*d) { //sprintf(debuf,"oh shit, error at %U",items); //rtlDebugOutString(debuf); return -2; } *d = '\0'; i = atoi(buffer); row_height[items++] = i; /*if (items > 5) { sprintf(debuf, "set row from %S hei %U %U",buffer,items-1,i); rtlDebugOutString(debuf); }*/ if (items == row_count) { step++; // а далее лежат ячейки в файле // записаны они в кривом формате // ибо писал сей код я темной ночью // но не курил травы, клянусь я вам // иначе бы и этого не скодил // дебажить сей мне код премного впадлу // но помню правило - коль написал дебажь // немедленно - а то нах все забудешь. // вот выпью - а там сразу за отладку. //sprintf(debuf, "before read cells offset %U %X",fileInfo.OffsetLow,fileInfo.OffsetLow); //rtlDebugOutString(debuf); } d+=2; break; // о, бряки я забыл забить. о ужас. // позор мне, на костре меня сожгите // ведь тот, кто break не ставит после casa // подобен ламеру, что си не знает // смогу ли я такое пережить? case 2: // ячейки, ибо их содержимое сохранено здесь от исчезновения d = buffer; while (*d && *d++ != ' '); // оужжас. зачем только я писал этот бред.... d--; if (!*d) { return -2; } *d = '\0'; i = atoi(buffer); d++; s=d; while (*d && *d++ != ':'); // когда-то я удивлялся, как люди могут такую херню писать... дожил d--; if (!*d) { return -2; } *d = '\0'; j = atoi(s); //rtlDebugOutString(s); d++; k = d; while (*d && *d++ != '\n'); d--; *d = '\0'; d+=2; //sprintf(debuf, "i:%U j:%U d:%S\n",i,j,k); //rtlDebugOutString(debuf); cells[i][j] = (char*)allocmem(strlen(k) + 1); //memset(cells[i][j], 0, strlen(k) + 1); strcpy(cells[i][j], k); //sprintf(debuf, "offset: %U", fileInfo.OffsetLow); //rtlDebugOutString(debuf); } fileInfo.OffsetLow += d - (char*)buffer - 1; } //rtlDebugOutString("loading finished"); return 1; }