Считать настройки из файла, которые расположены не по порядку - 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы:
    • include - для работы с консолью

    • include - для работы с функциями exit и atoi

    • include - для работы со временем

    • include - для работы с регулярными выражениями

    • include - для работы со строками

  2. Определяем константы:
    • const int true = 1; - для удобства, т.к. в C нет встроенной константы true
    • const int false = 0; - аналогично, для удобства
  3. Создаем массив строк:
    • char* s[] = {123, 312.993, 12/10/2010, 5.7}; - в данном случае это четыре строки для проверки
  4. Компилируем регулярные выражения:
    • 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); - для поиска даты в формате день месяц год
  5. Проверяем каждую строку на соответствие регулярным выражениям:
    • 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]);
      • }
      • 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]);
      • }
      • 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]);
      • }
    • }
  6. Завершаем программу:
    • return 0; - для успешного завершения программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.286 из 5
Похожие ответы