mantech 34 26 марта, 2019 Опубликовано 26 марта, 2019 · Жалоба 8 минут назад, simark1979 сказал: Могу быть не совсем быть точным. Но если файл с данными содержит в себе только данные (не обернутые в js или html) , браузеры (кроме Mozilla) не даст его открыть из соображений безопасности, либо придется делать лишние телодвижения типа загрузки на сервер. Вам не об этом пытались сказать, а то, что файлы хтмл "готовятся" при запросе исходя из бинарных данных, которые копятся по мере прихода новых, а не постоянное обновление хтмл-а... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 марта, 2019 Опубликовано 26 марта, 2019 · Жалоба 1 час назад, simark1979 сказал: Хранить это дело предполагается в виде html страницы, чтобы открыв в браузере на компе можно было посмотреть данные в виде графиков. На каждый месяц хочу иметь свой самодостаточный html (чтобы в одном документе была страница + данные) Ну вот - как я и предполагал.... очередной самопальный деревянный конь.... Объясните нам - зачем тут запись в середину файла??? Функция printf() спасёт отца русской демократии. И сделает ваши записи в файл простыми и последовательными... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба Данные храните структурированно в текстовом файле. Потом пишете утилитку на стороне компа которая легким движением руки представляет ваши данные хоть в html хоть где угодно. я так делал когда то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 28 марта, 2019 Опубликовано 28 марта, 2019 (изменено) · Жалоба On 3/26/2019 at 8:10 PM, jcxz said: Ну вот - как я и предполагал.... очередной самопальный деревянный конь.... Объясните нам - зачем тут запись в середину файла??? Функция printf() спасёт отца русской демократии. И сделает ваши записи в файл простыми и последовательными... Не знаю, это ли вы имели ввиду....можно так: Выставил указатель перед статичным хвостом, вписал новые данные и хвост. Спасибо за наводку! 10 minutes ago, jenya7 said: Данные храните структурированно в текстовом файле. Потом пишете утилитку на стороне компа которая легким движением руки представляет ваши данные хоть в html хоть где угодно. я так делал когда то. Повторюсь, расчёт на пользователей, которые ничего не должны скачивать. Изменено 28 марта, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба 11 minutes ago, simark1979 said: Мля, точно! отступил немного назад и вписал новые данные + хвост. Спасибо! Повторюсь, расчёт на пользователей, которые ничего не должны скачивать. добавляйте теги на лету. так я тоже делал. код правда для си-шарп но можно переделать на си. Spoiler private const string IMG = "<img src='C:\\Images\\ate small.bmp'></img><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">"; private const string HEAD = "<HEAD> <META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=iso-8859-1\"> <TITLE>Report</TITLE></HEAD>"; private const string DOC_TITLE = "<FONT FACE=VERDANA><a name=\"-1-2012-9-6-9-38-33-953\"></a><H3>UUT Report</H3><H4>"; //GLOBAL DATA SECTION private const string GLOBSECT_TABLE_START = "<TABLE BORDERCOLOR=#000000 WIDTH=70% FRAME=VOID><TBODY>"; private const string GLOBSECT_ROW_START = "<TR><TD NOWRAP='NOWRAP'><B><LI>"; private const string GLOBSECT_ROW_MID = "</B><TD><B>"; private const string ROW_END = "</B>"; private const string UUT_RESULT_PASSED = "<TR><TD NOWRAP='NOWRAP'><B><LI>UUT Result: </B><TD><B><FONT COLOR=#008000>Passed</FONT></B>"; private const string UUT_RESULT_FAILED = "<TR><TD NOWRAP='NOWRAP'><B><LI>UUT Result: </B><TD><B><FONT COLOR=#FF0000>Failed</FONT></B>"; private const string GLOBSECT_TABLE_END = "</TBODY></TABLE><BR></H4><HR SIZE=3 COLOR=#8000CC ALIGN=LEFT WIDTH=50%>"; private const string SPLITER = "<BLOCKQUOTE>"; private const string SEQ_BEGIN = "<H5><NOBR>Begin Sequence: MainSequence "; private const string SEQ_NAME_START = "<BR>"; private const string SEQ_NAME_END = "<BR></NOBR></H5>"; private const string MAIN_TABLE_START = "<table BORDERCOLOR=#000000 FRAME=BOX RULES=ALL WIDTH=70%><TBODY>"; //STEP SECTION private const string STEP_ROW_START1 = "<TR><TD BGCOLOR=#FFFFFF valign=\"top\"><FONT SIZE=-1>"; private const string STEP_ROW_START2 = "<TR><TD COLSPAN=2 BGCOLOR=#FFFFFF valign=\"top\"><FONT SIZE=-1>"; private const string STEP_ROW_END = "<TD BGCOLOR=#32FFFF WIDTH = 37% valign=\"top\"><FONT SIZE=-1>"; private const string SYS_STEP_NAME_START = "<TR><TD COLSPAN=2 BGCOLOR=#FF8000>"; private const string SYS_STEP_NAME_END = "<TR><TD COLSPAN = 2>"; private const string STATUS_ROW_PASSED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#00FF00 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Passed"; private const string STATUS_ROW_DONE = STEP_ROW_START1 + "Status: <TD BGCOLOR=#00FFCC WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Done"; private const string STATUS_ROW_SKIPED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#FFFF00 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Skipped"; private const string STATUS_ROW_FAILED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#FF0000 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Failed"; private const string LIMITS_ROW = STEP_ROW_START2 + "Limits:"; private const string LIMIT_HIGH = STEP_ROW_START1 + " High:" + STEP_ROW_END; private const string LIMIT_LOW = STEP_ROW_START1 + " Low:" + STEP_ROW_END; private const string MULTIMEAS_ROW = STEP_ROW_START2 + "Measurement:"; private const string MULTIMEAS_LIM_LOW = STEP_ROW_START1 + " Low:" + STEP_ROW_END; private const string MULTIMEAS_LIM_HIGH = STEP_ROW_START1 + " High:" + STEP_ROW_END; private const string MULTIMEAS_UNITS = STEP_ROW_START1 + " Units:" + STEP_ROW_END; private const string MULTIMEAS_COMPTYPE = STEP_ROW_START1 + " Comparison Type:" + STEP_ROW_END; private const string MULTIMEAS_DATA = STEP_ROW_START1 + " Data:" + STEP_ROW_END; private const string MULTIMEAS_STATUS = STEP_ROW_START1 + " Status:" + STEP_ROW_END; private const string STR_ROW = STEP_ROW_START1 + "String:" + STEP_ROW_END; private const string STR_LIM = STEP_ROW_START1 + " String:" + STEP_ROW_END; private const string STR_COMPTYPE = STEP_ROW_START1 + "Comparison Type:" + STEP_ROW_END; StreamWriter sr; //constractor public HTML() { } public HTML(string _filename) { sr = new System.IO.StreamWriter(_filename); } public bool Create(string filename) { try { File.Create(filename); return true; } catch { return false; } } public bool WriteToFile(string filename) { //if (File.Exists(filename)) //{ try { //File.Open(filename, FileMode.Append, FileAccess.Write); sr.WriteLine(HEAD); sr.WriteLine(DOC_TITLE); sr.WriteLine(GLOBSECT_TABLE_START); sr.WriteLine(GLOBSECT_ROW_START + "UUT Description: " + GLOBSECT_ROW_MID + "HPM Drive" + ROW_END); sr.WriteLine(GLOBSECT_ROW_START + "Serial Number: " + GLOBSECT_ROW_MID + "33212-01050" + ROW_END); sr.WriteLine(GLOBSECT_TABLE_END); sr.Close(); return true; } catch { return false; } //} //else //{ //return false; //} } public void WriteReportStart() { sr.WriteLine(HEAD); sr.WriteLine("<HTML>"); sr.WriteLine(DOC_TITLE); sr.WriteLine("<BODY>"); sr.WriteLine("<TABLE BORDERCOLOR=#000000 FRAME=BOX RULES=ALL WIDTH=70%><TBODY>"); //sr.WriteLine(GLOBSECT_TABLE_START); } public void WriteReportEnd() { sr.WriteLine("</TABLE><BR>"); sr.WriteLine("</FONT></BODY>"); sr.WriteLine("</HTML>"); sr.Close(); } public void WriteGlobalInfo(string var_name, string var_data) { sr.WriteLine(GLOBSECT_ROW_START + var_name + ": " + GLOBSECT_ROW_MID + var_data + ROW_END); } public void WriteStepInfo(Test test) { //write test name sr.WriteLine("<TR><TD COLSPAN=2 BGCOLOR=#00C4C4>" + test.TestName); //write test status switch (test.teststatus) { case BaseTest.Status.Skipped: sr.WriteLine(STATUS_ROW_SKIPED); break; case BaseTest.Status.Done: sr.WriteLine(STATUS_ROW_DONE); break; case BaseTest.Status.Passed: sr.WriteLine(STATUS_ROW_PASSED); break; case BaseTest.Status.Failed: sr.WriteLine(STATUS_ROW_FAILED); break; } if (test.teststatus == BaseTest.Status.Skipped) return; //write measurement - it depends on test type switch (test.testtype) { case BaseTest.TestType.Numeric: if (test.measurements != null) { sr.WriteLine(STEP_ROW_START1 + "Measurement:" + STEP_ROW_END + test.measurements[0].value.ToString()); if (test.measurements[0].units != null) sr.WriteLine(STEP_ROW_START1 + "Units:" + STEP_ROW_END + test.measurements[0].units); else sr.WriteLine(STEP_ROW_START1 + "Units:" + STEP_ROW_END + ""); sr.WriteLine(STEP_ROW_START1 + "Limits:"); sr.WriteLine(STEP_ROW_START1 + " Low:" + STEP_ROW_END + test.measurements[0].min_lim); sr.WriteLine(STEP_ROW_START1 + " High:" + STEP_ROW_END + test.measurements[0].max_lim); sr.WriteLine(STEP_ROW_START1 + "Comparison Type:" + STEP_ROW_END + test.measurements[0].comp_type); } else sr.WriteLine(STEP_ROW_START1 + "Measurement:" + STEP_ROW_END + "NAN"); break; case BaseTest.TestType.MultiNumeric: sr.WriteLine(MULTIMEAS_ROW); if (test.measurements != null && test.measurements.Length > 1) { sr.WriteLine(STEP_ROW_START1 + "Measurement:"); for (int i = 0; i < test.measurements.Length; i++) { sr.WriteLine(STEP_ROW_START1 + " Measurement" + "[" + i.ToString() + "] " + test.measurements[i].meas_name); sr.WriteLine(LIMITS_ROW); sr.WriteLine(MULTIMEAS_LIM_LOW + test.measurements[i].min_lim); //TBD - if comparison type GELE... sr.WriteLine(MULTIMEAS_LIM_HIGH + test.measurements[i].max_lim); if (test.measurements[0].units != null) sr.WriteLine(MULTIMEAS_UNITS + test.measurements[0].units); else sr.WriteLine(MULTIMEAS_UNITS + ""); sr.WriteLine(MULTIMEAS_COMPTYPE + test.measurements[0].comp_type); sr.WriteLine(MULTIMEAS_DATA + test.measurements[0].value); sr.WriteLine(MULTIMEAS_STATUS + test.measurements[0].status); } } break; case BaseTest.TestType.String: sr.WriteLine(STR_ROW + test.measurements[0].value); sr.WriteLine(LIMITS_ROW); sr.WriteLine(STR_LIM + test.measurements[0].min_lim); sr.WriteLine(STR_COMPTYPE + test.measurements[0].comp_type ); break; } //write additional results if (test.AdditiobalResults != null) { for (int i = 0; i < test.AdditiobalResults.Length; i++) sr.WriteLine(STEP_ROW_START1 + "name: " + STEP_ROW_END + "data"); } //write test time sr.WriteLine(STEP_ROW_START1 + "Module Time: " + STEP_ROW_END); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба 1 minute ago, jenya7 said: добавляйте теги на лету. так я тоже делал. код правда для си-шарп но можно переделать на си. Reveal hidden contents private const string IMG = "<img src='C:\\Images\\ate small.bmp'></img><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">"; private const string HEAD = "<HEAD> <META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=iso-8859-1\"> <TITLE>Report</TITLE></HEAD>"; private const string DOC_TITLE = "<FONT FACE=VERDANA><a name=\"-1-2012-9-6-9-38-33-953\"></a><H3>UUT Report</H3><H4>"; //GLOBAL DATA SECTION private const string GLOBSECT_TABLE_START = "<TABLE BORDERCOLOR=#000000 WIDTH=70% FRAME=VOID><TBODY>"; private const string GLOBSECT_ROW_START = "<TR><TD NOWRAP='NOWRAP'><B><LI>"; private const string GLOBSECT_ROW_MID = "</B><TD><B>"; private const string ROW_END = "</B>"; private const string UUT_RESULT_PASSED = "<TR><TD NOWRAP='NOWRAP'><B><LI>UUT Result: </B><TD><B><FONT COLOR=#008000>Passed</FONT></B>"; private const string UUT_RESULT_FAILED = "<TR><TD NOWRAP='NOWRAP'><B><LI>UUT Result: </B><TD><B><FONT COLOR=#FF0000>Failed</FONT></B>"; private const string GLOBSECT_TABLE_END = "</TBODY></TABLE><BR></H4><HR SIZE=3 COLOR=#8000CC ALIGN=LEFT WIDTH=50%>"; private const string SPLITER = "<BLOCKQUOTE>"; private const string SEQ_BEGIN = "<H5><NOBR>Begin Sequence: MainSequence "; private const string SEQ_NAME_START = "<BR>"; private const string SEQ_NAME_END = "<BR></NOBR></H5>"; private const string MAIN_TABLE_START = "<table BORDERCOLOR=#000000 FRAME=BOX RULES=ALL WIDTH=70%><TBODY>"; //STEP SECTION private const string STEP_ROW_START1 = "<TR><TD BGCOLOR=#FFFFFF valign=\"top\"><FONT SIZE=-1>"; private const string STEP_ROW_START2 = "<TR><TD COLSPAN=2 BGCOLOR=#FFFFFF valign=\"top\"><FONT SIZE=-1>"; private const string STEP_ROW_END = "<TD BGCOLOR=#32FFFF WIDTH = 37% valign=\"top\"><FONT SIZE=-1>"; private const string SYS_STEP_NAME_START = "<TR><TD COLSPAN=2 BGCOLOR=#FF8000>"; private const string SYS_STEP_NAME_END = "<TR><TD COLSPAN = 2>"; private const string STATUS_ROW_PASSED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#00FF00 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Passed"; private const string STATUS_ROW_DONE = STEP_ROW_START1 + "Status: <TD BGCOLOR=#00FFCC WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Done"; private const string STATUS_ROW_SKIPED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#FFFF00 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Skipped"; private const string STATUS_ROW_FAILED = STEP_ROW_START1 + "Status: <TD BGCOLOR=#FF0000 WIDTH = 37% valign=\"top\"><FONT SIZE=-1>Failed"; private const string LIMITS_ROW = STEP_ROW_START2 + "Limits:"; private const string LIMIT_HIGH = STEP_ROW_START1 + " High:" + STEP_ROW_END; private const string LIMIT_LOW = STEP_ROW_START1 + " Low:" + STEP_ROW_END; private const string MULTIMEAS_ROW = STEP_ROW_START2 + "Measurement:"; private const string MULTIMEAS_LIM_LOW = STEP_ROW_START1 + " Low:" + STEP_ROW_END; private const string MULTIMEAS_LIM_HIGH = STEP_ROW_START1 + " High:" + STEP_ROW_END; private const string MULTIMEAS_UNITS = STEP_ROW_START1 + " Units:" + STEP_ROW_END; private const string MULTIMEAS_COMPTYPE = STEP_ROW_START1 + " Comparison Type:" + STEP_ROW_END; private const string MULTIMEAS_DATA = STEP_ROW_START1 + " Data:" + STEP_ROW_END; private const string MULTIMEAS_STATUS = STEP_ROW_START1 + " Status:" + STEP_ROW_END; private const string STR_ROW = STEP_ROW_START1 + "String:" + STEP_ROW_END; private const string STR_LIM = STEP_ROW_START1 + " String:" + STEP_ROW_END; private const string STR_COMPTYPE = STEP_ROW_START1 + "Comparison Type:" + STEP_ROW_END; StreamWriter sr; //constractor public HTML() { } public HTML(string _filename) { sr = new System.IO.StreamWriter(_filename); } public bool Create(string filename) { try { File.Create(filename); return true; } catch { return false; } } public bool WriteToFile(string filename) { //if (File.Exists(filename)) //{ try { //File.Open(filename, FileMode.Append, FileAccess.Write); sr.WriteLine(HEAD); sr.WriteLine(DOC_TITLE); sr.WriteLine(GLOBSECT_TABLE_START); sr.WriteLine(GLOBSECT_ROW_START + "UUT Description: " + GLOBSECT_ROW_MID + "HPM Drive" + ROW_END); sr.WriteLine(GLOBSECT_ROW_START + "Serial Number: " + GLOBSECT_ROW_MID + "33212-01050" + ROW_END); sr.WriteLine(GLOBSECT_TABLE_END); sr.Close(); return true; } catch { return false; } //} //else //{ //return false; //} } public void WriteReportStart() { sr.WriteLine(HEAD); sr.WriteLine("<HTML>"); sr.WriteLine(DOC_TITLE); sr.WriteLine("<BODY>"); sr.WriteLine("<TABLE BORDERCOLOR=#000000 FRAME=BOX RULES=ALL WIDTH=70%><TBODY>"); //sr.WriteLine(GLOBSECT_TABLE_START); } public void WriteReportEnd() { sr.WriteLine("</TABLE><BR>"); sr.WriteLine("</FONT></BODY>"); sr.WriteLine("</HTML>"); sr.Close(); } public void WriteGlobalInfo(string var_name, string var_data) { sr.WriteLine(GLOBSECT_ROW_START + var_name + ": " + GLOBSECT_ROW_MID + var_data + ROW_END); } public void WriteStepInfo(Test test) { //write test name sr.WriteLine("<TR><TD COLSPAN=2 BGCOLOR=#00C4C4>" + test.TestName); //write test status switch (test.teststatus) { case BaseTest.Status.Skipped: sr.WriteLine(STATUS_ROW_SKIPED); break; case BaseTest.Status.Done: sr.WriteLine(STATUS_ROW_DONE); break; case BaseTest.Status.Passed: sr.WriteLine(STATUS_ROW_PASSED); break; case BaseTest.Status.Failed: sr.WriteLine(STATUS_ROW_FAILED); break; } if (test.teststatus == BaseTest.Status.Skipped) return; //write measurement - it depends on test type switch (test.testtype) { case BaseTest.TestType.Numeric: if (test.measurements != null) { sr.WriteLine(STEP_ROW_START1 + "Measurement:" + STEP_ROW_END + test.measurements[0].value.ToString()); if (test.measurements[0].units != null) sr.WriteLine(STEP_ROW_START1 + "Units:" + STEP_ROW_END + test.measurements[0].units); else sr.WriteLine(STEP_ROW_START1 + "Units:" + STEP_ROW_END + ""); sr.WriteLine(STEP_ROW_START1 + "Limits:"); sr.WriteLine(STEP_ROW_START1 + " Low:" + STEP_ROW_END + test.measurements[0].min_lim); sr.WriteLine(STEP_ROW_START1 + " High:" + STEP_ROW_END + test.measurements[0].max_lim); sr.WriteLine(STEP_ROW_START1 + "Comparison Type:" + STEP_ROW_END + test.measurements[0].comp_type); } else sr.WriteLine(STEP_ROW_START1 + "Measurement:" + STEP_ROW_END + "NAN"); break; case BaseTest.TestType.MultiNumeric: sr.WriteLine(MULTIMEAS_ROW); if (test.measurements != null && test.measurements.Length > 1) { sr.WriteLine(STEP_ROW_START1 + "Measurement:"); for (int i = 0; i < test.measurements.Length; i++) { sr.WriteLine(STEP_ROW_START1 + " Measurement" + "[" + i.ToString() + "] " + test.measurements[i].meas_name); sr.WriteLine(LIMITS_ROW); sr.WriteLine(MULTIMEAS_LIM_LOW + test.measurements[i].min_lim); //TBD - if comparison type GELE... sr.WriteLine(MULTIMEAS_LIM_HIGH + test.measurements[i].max_lim); if (test.measurements[0].units != null) sr.WriteLine(MULTIMEAS_UNITS + test.measurements[0].units); else sr.WriteLine(MULTIMEAS_UNITS + ""); sr.WriteLine(MULTIMEAS_COMPTYPE + test.measurements[0].comp_type); sr.WriteLine(MULTIMEAS_DATA + test.measurements[0].value); sr.WriteLine(MULTIMEAS_STATUS + test.measurements[0].status); } } break; case BaseTest.TestType.String: sr.WriteLine(STR_ROW + test.measurements[0].value); sr.WriteLine(LIMITS_ROW); sr.WriteLine(STR_LIM + test.measurements[0].min_lim); sr.WriteLine(STR_COMPTYPE + test.measurements[0].comp_type ); break; } //write additional results if (test.AdditiobalResults != null) { for (int i = 0; i < test.AdditiobalResults.Length; i++) sr.WriteLine(STEP_ROW_START1 + "name: " + STEP_ROW_END + "data"); } //write test time sr.WriteLine(STEP_ROW_START1 + "Module Time: " + STEP_ROW_END); } Так и сделаю, спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба 1 час назад, simark1979 сказал: Не знаю, это ли вы имели ввиду....можно так: Выставил указатель перед статичным хвостом, вписал новые данные и хвост. Ну как что: в тех местах HTML, где надо впечатывать беззнаковые числа вставить "%u", где строки - "%s", и так далее. Потом скормить весь этот HTML printf-у как строку, добавив соответствующие аргументы. Я не знаю формата HTML - если по его формату нельзя вставить такие управляющие последовательности printf (из-за конфликтов с командами форматной строки printf), то вставить другие маркеры. Когда же нужно распечатать страницу - делаем поиск очередного маркера, печатаем в printf содержимое куска HTML от текущей позиции до маркера, далее - печатаем нужное значение, дальше - ищем следующий маркер и так далее - до конца HTML. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 28 марта, 2019 Опубликовано 28 марта, 2019 (изменено) · Жалоба 2 hours ago, jcxz said: Ну как что: в тех местах HTML, где надо впечатывать беззнаковые числа вставить "%u", где строки - "%s", и так далее. Потом скормить весь этот HTML printf-у как строку, добавив соответствующие аргументы. Я не знаю формата HTML - если по его формату нельзя вставить такие управляющие последовательности printf (из-за конфликтов с командами форматной строки printf), то вставить другие маркеры. Когда же нужно распечатать страницу - делаем поиск очередного маркера, печатаем в printf содержимое куска HTML от текущей позиции до маркера, далее - печатаем нужное значение, дальше - ищем следующий маркер и так далее - до конца HTML. Всё гораздо проще. Есть html файл, который я цепляю линкером к прошивке Далее создаю файл-шаблон html (данные беру из секции, куда линкер запихал html файл) <html> <body> ................... .................. <script> ...................... const MONTH_DATA = [ 21.04.19 14:07:03;cl_pump;0 21.04.19 14:07:03;water_ph;8.5 21.04.19 14:07:04;water_ph;8.2 21.04.19 14:07:04;water_stream;1 21.04.19 14:07:05;cl_pump;1 -> место для новых данных ]; ...................... </script> </body> </html> Отступ с конца файла, куда я должен дописывать новые данные, всегда один и тот же. Собственно всё. 1. Открыл файл 2. Выставил указатель на место для новых данных (конец файла - const_отступ_снизу) 3. Записал новые данные 4. Прицепил хвост. 5. Закрыл файл. Изменено 28 марта, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться