Считать настройки из файла, которые расположены не по порядку - C (СИ)
Формулировка задачи:
есть такой вот код, задача считать настройки из файла, которые расположены не по порядку (по строкам)
я сделал как смог, считываю первые 4 символа и всё..
вопрос, где можно почитать (на русском) про регулярные выражения (С), и как конкретно их пременить..
и второй вопрос, можно ли с помошью них узнать что например настроек в файле не хватает, и оповестить об этом пользователя?
FILE *fpLOG; fpLOG=fopen("../log/log.txt", "ab"); const time_t timer=time(NULL); char timestr[100]; if(sscanf(ctime(&timer), "%[^\n]", timestr) == 1) {fprintf(fpLOG, "%s ", timestr); printf("%s ", timestr); } if((fp=fopen("../etc/nastr.cfg", "r")) == NULL) { printf("net faila c nastroikami \n"); fprintf (fpLOG,"net faila c nastroikami \n"); return(1); } char nastr[5]; /////N int z; for (z=1; z<=N; z++) { fscanf(fp, "%4s", &nastr); int m=0; if (!strcmp(nastr,"dat1")) m=1; if (!strcmp(nastr,"dat2")) m=2; if (!strcmp(nastr,"tim1")) m=3; if (!strcmp(nastr,"tim2")) m=4; if (!strcmp(nastr,"step")) m=5; switch (m) { case 1: fscanf(fp, " = %2d.%2d.%4d""\n", &day1, &month1, &year1); fprintf(fpLOG,"dat1 = %02d.%02d.%04d ", day1, month1, year1); printf("dat1 = %02d.%02d.%04d ", day1, month1, year1); break; case 2: fscanf(fp, " = %2d.%2d.%4d""\n", &day2, &month2, &year2); fprintf(fpLOG,"dat2 = %02d.%02d.%04d ", day2, month2, year2); printf("dat2 = %02d.%02d.%04d ", day2, month2, year2); break; case 3: fscanf(fp, " = %2d:%2d:%2d,%3d""\n", &hour1, &min1, &sec1, &msec1); fprintf(fpLOG,"tim1 = %02d:%02d:%02d,%03d ", hour1, min1, sec1, msec1); printf("tim1 = %02d:%02d:%02d,%03d ", hour1, min1, sec1, msec1); break; case 4: fscanf(fp, " = %2d:%2d:%2d,%3d""\n", &hour2, &min2, &sec2, &msec2); fprintf(fpLOG,"tim2 = %02d:%02d:%02d,%03d ", hour2, min2, sec2, msec2); printf("tim2 = %02d:%02d:%02d,%03d ", hour2, min2, sec2, msec2); break; case 5: fscanf(fp, " = %d\n", &step); fprintf(fpLOG,"step = %d ", step); printf("step = %d ", step); break; }//end switch }//for
Решение задачи: «Считать настройки из файла, которые расположены не по порядку»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <pcre.h> #include <string.h> const int true = 1; const int false = 0; int main() { char* s[] = {"123", "312.993", "12/10/2010", "5.7"}; const char* error; int erroroffset; int result; const int ovector_length = 30; int ovector[ovector_length]; pcre *regexp_float = pcre_compile("^\\d+\\.\\d+$", 0, &error, &erroroffset, 0); pcre *regexp_int = pcre_compile("^\\d+$", 0, &error, &erroroffset, 0); pcre *regexp_date = pcre_compile("^\\d+(\\D)\\d+\\1\\d+$", 0, &error, &erroroffset, 0); int i; for (i=0; i<4; i++) { int len = strlen(s[i]); result=pcre_exec(regexp_int, NULL, s[i], len, 0, 0, ovector, ovector_length); if (result>-1) printf("%s is an integer.\n", s[i]); result=pcre_exec(regexp_float, NULL, s[i], len, 0, 0, ovector, ovector_length); if (result>-1) printf("%s is a float.\n", s[i]); result=pcre_exec(regexp_date, NULL, s[i], len, 0, 0, ovector, ovector_length); if (result>-1) printf("%s is a date.\n", s[i]); } return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
-
include
- для работы с консолью -
include
- для работы с функциями exit и atoi -
include
- для работы со временем -
include
- для работы с регулярными выражениями -
include
- для работы со строками
-
- Определяем константы:
- const int true = 1; - для удобства, т.к. в C нет встроенной константы true
- const int false = 0; - аналогично, для удобства
- Создаем массив строк:
- char* s[] = {
123
,312.993
,12/10/2010
,5.7
}; - в данном случае это четыре строки для проверки
- char* s[] = {
- Компилируем регулярные выражения:
- pcre *regexp_float = pcre_compile(
^\\d+\\.\\d+$
, 0, &error, &erroroffset, 0); - для поиска чисел с плавающей точкой - pcre *regexp_int = pcre_compile(
^\\d+$
, 0, &error, &erroroffset, 0); - для поиска целых чисел - pcre *regexp_date = pcre_compile(
^\\d+(\\D)\\d+\\1\\d+$
, 0, &error, &erroroffset, 0); - для поиска даты в форматедень месяц год
- pcre *regexp_float = pcre_compile(
- Проверяем каждую строку на соответствие регулярным выражениям:
- int i;
- for (i=0; i<4; i++)
- {
- int len = strlen(s[i]);
- int result=pcre_exec(regexp_int, NULL, s[i], len, 0, 0, ovector, ovector_length);
- if (result>-1)
- {
- printf(
%s is an integer.\n
, s[i]);
- printf(
- }
- int result=pcre_exec(regexp_float, NULL, s[i], len, 0, 0, ovector, ovector_length);
- if (result>-1)
- {
- printf(
%s is a float.\n
, s[i]);
- printf(
- }
- int result=pcre_exec(regexp_date, NULL, s[i], len, 0, 0, ovector, ovector_length);
- if (result>-1)
- {
- printf(
%s is a date.\n
, s[i]);
- printf(
- }
- }
- Завершаем программу:
- return 0; - для успешного завершения программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д