Добрый день подскажите пожалуйста! На sd карте находится документ txt с такими данными (345, 456),(345,676),(67,908),... как их можно считать и записать в одномерный численный массив(long) для дальнейшей обработки???
Данный код прорабатывала. Не получается считать массив (345, 456),(345,676),(67,908), который находится в файле на sd в переменную long[ ]. ниже приведен код, но он не работает (зацикливается) //================================================================= fileReadShifr = SD.open("SHIFR.txt"); if (fileReadShifr) { int i=0; while (fileReadShifr.available()) { char c = fileReadShifr.read(); SLOVO_SHIFR = c; i++; Serial.print(SLOVO_SHIFR[2]); delay(1); } SLOVO_SHIFR= '\0'; fileReadShifr.close(); }
Чтобы упростить программу скажите: 1. Какой размер массива 2. Обязательно ли хранить данные в виде "(345, 456),(345,676),(67,908)" или можно по другому сделать, например "345 456 345 676 67 908"
Суть программы следующая: есть текст в файле, его шифрую результат шифровки координаты (х, у) в виде цифр их я записала в файл, а сейчас проблема их считать в переменную для дальнейшей операции расшифрования.
Вам надо написать парсер текстовой строки Т.к. файл с данными подготовили сами, то можно предположить, что в нем нет синтаксических ошибок. На основании этого предположения получается что в строке надо откинуть все лишние символы в встречающиеся цифры сложить в числа и преобразовать в long Т.е. алгоритм такой: 0. Coord_x = 0; coord_y = 0; 1. Считать символ sym, если символ не является цифрой (функция IsDigit), то вернуться к пункту 1 2. Coord_x = coord_x * 10 + (sym - 48); - так накапливаем цифра за цифрой наш long 3. Считываем символ. Если цифра, то переходим к пункту 2, если не цифра, то к пункту 4 4. Повторить пункты 1-3, но уже для координаты У Выполняя все это не забываем проверять не закончился ли файл
Попробуйте http://www.arduino.cc/en/Reference/StreamParseInt. Сам не проверял, но судя по описанию, Вам просто надо в цикле вызывать parseInt, каждые два последовательных вызова образуют пару координат.
Как сделать парсер я разобралась, но не могу считать символы с файла в переменную. Когда пытаюсь вывести символ Serial.print(SLOVO_SHIFR[2]); то происходит зацикливание и печатается белиберда Код (Text): /* * SD карта подключается так: ** MOSI - пин 11 ** MISO - пин 12 ** CLK - пин 13 ** CS - пин 4 */ #include <iostream> #include <stdio.h> #include <string> #include <limits.h> #include <iostream> #include <string.h> #include <SD.h> // Глобальные переменные long BukvaToKoord[]={0,0}; long BukvaToKoord_GAMMA[]={0,0}; char Point_to_bukva[]=""; long S[] = { 0,0 }; long V[] = { 0,0 }; long W[] = { 0,0 }; char ALF[]= {' ','!','$','%', '&','(',')','*','+',',','-', '.','/','0','1','2','3','4','5', '6','7','8','9',':',';','?', 'A','B','C','D','E', 'F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S', 'T','U','V','W','X','Y','Z', '_','a','b', 'c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s', 't','u','v','w','x','y','z','{', '}' }; int ALFAVIT[][2] ={{33,355},{33,396}, {34,74},{36,664},{39,580}, {43,224},{43,527},{44,366},{44,385},{45,31},{45,720}, {47,349},{47,402},{48,49},{48,702},{49,183},{49,568}, {53,277},{53,474},{56,332},{56,419},{58,139},{58,612}, {59,365},{59,386},{62,379}, {66,552},{67,84},{67,667},{69,241},{69,510}, {70,195},{70,556},{72,254},{72,497},{73,72},{73,679}, {74,170},{74,581},{75,318},{75,433},{78,271},{78,480}, {79,111},{79,640},{80,318},{80,433},{82,270},{82,481}, {83,373},{83,378},{85,35},{86,25}, {93,484},{98,338},{98,413}, {99,295},{99,456},{100,364},{100,387},{102,267},{102,484}, {105,369},{105,382},{106,24},{106,727},{108,247},{108,504}, {109,200},{109,551},{110,129},{110,622},{114,144},{114,607}, {115,242},{115,509},{116,92},{116,659},{120,147},{120,604}, {125,459},{189,297}}; // функция mod================================================================ long mod( long A, long p) { long B; if (A < 0) B=(A % p) + p; else B = A % p; return B; } //===========mod_inverse====================================================== long mod_inverse(long a, long n) { long v = 0, i = n, d = 1; if (a < 0) a = a + n; while (a > 0) { long t = i / a, x = a; a = mod(i , x); i = x; x = d; d = v - t * x; v = x; } v %= n; if (v < 0) v = mod((v + n) , n); return v; } //===================Функция степени========================================== long QuickPow(long x, long y) { long result = 1; while (y > 0) { if ((y & 1) == 1) result *= x; x *= x; y >>= 1; } return result; } //============Функция POINT_ADD=============================================== long * POINT_ADD(long P[], long Q[], long p) { } //======Функция Вычитания================================================== long* VUCH(long P[], long Q[], long p) { } //============Перевод слова в координаты=================================== long *PEREVOD(char Bukva) { } //======Перевод гаммы в координаты========================================= long *PEREVOD_GAMMA(char Bukva_GAMMA) { int i=0; while(Bukva_GAMMA!=ALF[i]) { i++; } BukvaToKoord_GAMMA[0]=ALFAVIT[i][0]; BukvaToKoord_GAMMA[1]=ALFAVIT[i][1]; } //=======перевод из координат в символ===================================== char* PEREVOD_2(long Point[]) { for (int i=0;i<80;i++) { if(Point[0]==ALFAVIT[i][0]) { if(Point[1]==ALFAVIT[i][1]) { Point_to_bukva[0]=ALF[i]; } } } } File fileWrite; File fileReadSlovo; File fileReadGamma; File fileReadShifr; void setup() { char SLOVO[]=""; char* bufer; char SLOVO_GAMMA[]=""; char SLOVO_SHIFR[]=""; char* CIFRA_SHIFR[]={}; long p=751; long MASSIV[]={0,0}; long MASSIV_GAMMA[]={0,0}; // Open serial communications and wait for port to open: Serial.begin(9600); /// Serial.print("Initializing SD card..."); // Магия. Этот вывод должен быть настроен как выход. // Иначе, некоторые функции могут не работать. pinMode(4, OUTPUT); if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); //=============================== fileReadSlovo = SD.open("TEXT.txt"); if (fileReadSlovo) { int i=0; while (fileReadSlovo.available()) { char c = fileReadSlovo.read(); SLOVO[i] = c; i++; delay(1); } SLOVO[i]= '\0'; fileReadSlovo.close(); } //================================ fileReadGamma = SD.open("GAMMA.txt"); if (fileReadGamma) { int i=0; while (fileReadGamma.available()) { char c = fileReadGamma.read(); SLOVO_GAMMA[i] = c; i++; delay(1); } SLOVO_GAMMA[i]= '\0'; fileReadGamma.close(); } //======================================== // Открываем файл для записи. Только один файл // может быть открыт одновременно // вы можете закрыть файл, что бы открыть другой. fileWrite = SD.open("shifr.txt",FILE_WRITE); if(fileWrite){ for (int count_text=0; count_text<strlen(SLOVO); count_text++) { char b = SLOVO[count_text]; char g = SLOVO_GAMMA[count_text]; PEREVOD(b); MASSIV[0]=BukvaToKoord[0]; MASSIV[1]=BukvaToKoord[1]; // fileWrite.print(b); // fileWrite.print(":"); PEREVOD_GAMMA(g); MASSIV_GAMMA[0]=BukvaToKoord_GAMMA[0]; MASSIV_GAMMA[1]=BukvaToKoord_GAMMA[1]; // POINT_ADD(MASSIV,MASSIV_GAMMA,p); long x1,X1, x2,X2, x3, y1, y2, y3, L = 0, L1; x1 =X1= MASSIV[0]; y1 = MASSIV[1]; x2 =X2= MASSIV_GAMMA[0]; y2 = MASSIV_GAMMA[1]; if (MASSIV != MASSIV_GAMMA) L = mod(((y2 - y1) * mod_inverse(x2 - x1, p)), p); if (MASSIV == MASSIV_GAMMA) L = mod((3 * (QuickPow(x1, 2) - 1) * mod_inverse(2 * y1, p)), p); L1 = L; x3 = mod((QuickPow(L, 2) - X1 - X2), p); y3 = mod((L1 *(X1 - x3) - y1), p); fileWrite.print(x3); fileWrite.print(","); fileWrite.print(y3); fileWrite.print(";"); } fileWrite.close(); } //================================================================= fileReadShifr = SD.open("SHIFR.txt"); if (fileReadShifr) { int i=0; while (fileReadShifr.available()) { char c = fileReadShifr.read(); SLOVO_SHIFR[i] = c; i++; delay(1); } Serial.print(SLOVO_SHIFR[2]); SLOVO_SHIFR[i]= '\0'; fileReadShifr.close(); } } void loop() { //Тут ничего не происходит }
Как сделать парсер я разобралась, но не могу считать символы с файла в переменную. Когда пытаюсь вывести символ Serial.print(SLOVO_SHIFR[2]); то происходит зацикливание и печатается белиберда Код (Text): /* * SD карта подключается так: ** MOSI - пин 11 ** MISO - пин 12 ** CLK - пин 13 ** CS - пин 4 */ #include <iostream> #include <stdio.h> #include <string> #include <limits.h> #include <iostream> #include <string.h> #include <SD.h> // Глобальные переменные long BukvaToKoord[]={0,0}; long BukvaToKoord_GAMMA[]={0,0}; char Point_to_bukva[]=""; long S[] = { 0,0 }; long V[] = { 0,0 }; long W[] = { 0,0 }; char ALF[]= {' ','!','$','%', '&','(',')','*','+',',','-', '.','/','0','1','2','3','4','5', '6','7','8','9',':',';','?', 'A','B','C','D','E', 'F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S', 'T','U','V','W','X','Y','Z', '_','a','b', 'c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s', 't','u','v','w','x','y','z','{', '}' }; int ALFAVIT[][2] ={{33,355},{33,396}, {34,74},{36,664},{39,580}, {43,224},{43,527},{44,366},{44,385},{45,31},{45,720}, {47,349},{47,402},{48,49},{48,702},{49,183},{49,568}, {53,277},{53,474},{56,332},{56,419},{58,139},{58,612}, {59,365},{59,386},{62,379}, {66,552},{67,84},{67,667},{69,241},{69,510}, {70,195},{70,556},{72,254},{72,497},{73,72},{73,679}, {74,170},{74,581},{75,318},{75,433},{78,271},{78,480}, {79,111},{79,640},{80,318},{80,433},{82,270},{82,481}, {83,373},{83,378},{85,35},{86,25}, {93,484},{98,338},{98,413}, {99,295},{99,456},{100,364},{100,387},{102,267},{102,484}, {105,369},{105,382},{106,24},{106,727},{108,247},{108,504}, {109,200},{109,551},{110,129},{110,622},{114,144},{114,607}, {115,242},{115,509},{116,92},{116,659},{120,147},{120,604}, {125,459},{189,297}}; // функция mod================================================================ long mod( long A, long p) { long B; if (A < 0) B=(A % p) + p; else B = A % p; return B; } //===========mod_inverse====================================================== long mod_inverse(long a, long n) { long v = 0, i = n, d = 1; if (a < 0) a = a + n; while (a > 0) { long t = i / a, x = a; a = mod(i , x); i = x; x = d; d = v - t * x; v = x; } v %= n; if (v < 0) v = mod((v + n) , n); return v; } //===================Функция степени========================================== long QuickPow(long x, long y) { long result = 1; while (y > 0) { if ((y & 1) == 1) result *= x; x *= x; y >>= 1; } return result; } //============Функция POINT_ADD=============================================== long * POINT_ADD(long P[], long Q[], long p) { } //======Функция Вычитания================================================== long* VUCH(long P[], long Q[], long p) { } //============Перевод слова в координаты=================================== long *PEREVOD(char Bukva) { } //======Перевод гаммы в координаты========================================= long *PEREVOD_GAMMA(char Bukva_GAMMA) { int i=0; while(Bukva_GAMMA!=ALF[i]) { i++; } BukvaToKoord_GAMMA[0]=ALFAVIT[i][0]; BukvaToKoord_GAMMA[1]=ALFAVIT[i][1]; } //=======перевод из координат в символ===================================== char* PEREVOD_2(long Point[]) { for (int i=0;i<80;i++) { if(Point[0]==ALFAVIT[i][0]) { if(Point[1]==ALFAVIT[i][1]) { Point_to_bukva[0]=ALF[i]; } } } } File fileWrite; File fileReadSlovo; File fileReadGamma; File fileReadShifr; void setup() { char SLOVO[]=""; char* bufer; char SLOVO_GAMMA[]=""; char SLOVO_SHIFR[]=""; char* CIFRA_SHIFR[]={}; long p=751; long MASSIV[]={0,0}; long MASSIV_GAMMA[]={0,0}; // Open serial communications and wait for port to open: Serial.begin(9600); /// Serial.print("Initializing SD card..."); // Магия. Этот вывод должен быть настроен как выход. // Иначе, некоторые функции могут не работать. pinMode(4, OUTPUT); if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); //=============================== fileReadSlovo = SD.open("TEXT.txt"); if (fileReadSlovo) { int i=0; while (fileReadSlovo.available()) { char c = fileReadSlovo.read(); SLOVO[i] = c; i++; delay(1); } SLOVO[i]= '\0'; fileReadSlovo.close(); } //================================ fileReadGamma = SD.open("GAMMA.txt"); if (fileReadGamma) { int i=0; while (fileReadGamma.available()) { char c = fileReadGamma.read(); SLOVO_GAMMA[i] = c; i++; delay(1); } SLOVO_GAMMA[i]= '\0'; fileReadGamma.close(); } //======================================== // Открываем файл для записи. Только один файл // может быть открыт одновременно // вы можете закрыть файл, что бы открыть другой. fileWrite = SD.open("shifr.txt",FILE_WRITE); if(fileWrite){ for (int count_text=0; count_text<strlen(SLOVO); count_text++) { char b = SLOVO[count_text]; char g = SLOVO_GAMMA[count_text]; PEREVOD(b); MASSIV[0]=BukvaToKoord[0]; MASSIV[1]=BukvaToKoord[1]; // fileWrite.print(b); // fileWrite.print(":"); PEREVOD_GAMMA(g); MASSIV_GAMMA[0]=BukvaToKoord_GAMMA[0]; MASSIV_GAMMA[1]=BukvaToKoord_GAMMA[1]; // POINT_ADD(MASSIV,MASSIV_GAMMA,p); long x1,X1, x2,X2, x3, y1, y2, y3, L = 0, L1; x1 =X1= MASSIV[0]; y1 = MASSIV[1]; x2 =X2= MASSIV_GAMMA[0]; y2 = MASSIV_GAMMA[1]; if (MASSIV != MASSIV_GAMMA) L = mod(((y2 - y1) * mod_inverse(x2 - x1, p)), p); if (MASSIV == MASSIV_GAMMA) L = mod((3 * (QuickPow(x1, 2) - 1) * mod_inverse(2 * y1, p)), p); L1 = L; x3 = mod((QuickPow(L, 2) - X1 - X2), p); y3 = mod((L1 *(X1 - x3) - y1), p); fileWrite.print(x3); fileWrite.print(","); fileWrite.print(y3); fileWrite.print(";"); } fileWrite.close(); } //================================================================= fileReadShifr = SD.open("SHIFR.txt"); if (fileReadShifr) { int i=0; while (fileReadShifr.available()) { char c = fileReadShifr.read(); SLOVO_SHIFR[i] = c; i++; delay(1); } Serial.print(SLOVO_SHIFR[2]); SLOVO_SHIFR[i]= '\0'; fileReadShifr.close(); } } void loop() { //Тут ничего не происходит }
Знаете в чем основное отличие массива, от других структур данных? У него размер является константой. Соответственно Код (Text): char SLOVO_SHIFR[] = ""; является массивом размером в 1 символ Код (Text): // все С-строки содержат в себе завершающий '\0' char SLOVO_SHIFR[] = { '\0' }; В этом легко можно убедиться: Код (Text): // делим размер массива в байтах на размер его первого элемента в байтах // получаем размер массива в элементах, т.е. в данном случае в символах Serial.println(sizeof(SLOVO_SHIFR) / sizeof(SLOVO_SHIFR[0]); В Вашем коде Код (Text): int i=0; while (fileReadShifr.available()) { char c = fileReadShifr.read(); SLOVO_SHIFR[i] = c; i++; delay(1); } с большой вероятностью происходит запись данных за пределы массива, сначала Вы перезаписываете '\0', т.е. конец строки, а дальше уже пишете в память, которая не принадлежит массиву. Что, в свою очередь, может стать источником различных неопределенных эффектов. В качестве простого решения могу предложить объявление массива с фиксированным размером, достаточным, чтобы вмещать в себя слово, например: Код (Text): // массив из 32 символов, может вмещать строку до 31 символа + завершающий '\0' const size_t MAX_SHIFR_LEN = 32; char SLOVO_SHIFR[MAX_SHIFR_LEN]; // инициализируем весь массив нулями memset(SLOVO_SHIFR, 0, MAX_SHIFR_LEN); Размер массива (MAX_SHIFR_LEN) в Вашем случае зависит от данных, которые Вы читаете.
как можно из массива char (в котором хранится следующая информация 786,898; 896,453;786,898; 896,453)перевести в long 2х мерный??