Как выполнить поиск в текстовом файле? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Прочитал код через сом порт и записал его в текстовый файл, а теперь мне нужно этот код (из текстового файла ) перебрать распознать и выдать обратно через сом порт некие команды, в зависимости от тех данных которые были получены ранее, вот код, который я использую для чтение, собственно там нет ничего интересного код как код.
Листинг программы
  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <conio.h>
  4. #include <ctype.h>
  5. int main(void)
  6. {
  7. unsigned char result;
  8. int port = 0x3F8; /* serial port 1 */
  9. int anc = 0;
  10. int flag = 0;
  11. FILE* fin;
  12. fin = fopen("1.txt", "w+");
  13. printf("pusk\n");
  14.  
  15. outportb(port + 3, 0x80); /*set dlab on*/
  16. outportb(port + 1, 0x00); /*starschiy bait scorosti*/
  17. outportb(port + 0, 0x0C); /*scorosti mlads bait 9600*/
  18. outportb(port + 3, 0x03); /* set dlab off,8bit,no perity,1 stop bit */
  19. outportb(port + 1, 0x01); /*preryvanie po priemu*/
  20. inportb(port + 3); /*zadergka ignorirovan*/
  21. outportb(port + 2, 0xC7); /*FIFO registr */
  22. outportb(port + 4, 0x0b); /*DTR,RTS,OUT2*/
  23. inportb(port + 0); /*obnulenie bufera*/
  24.  
  25. while (flag == 0)
  26. {
  27. result = inportb(port + 2);
  28. if (result > 195) /*pervoe cc posle priema iz labview*/
  29. {
  30. result = inportb(port);
  31. printf("%c", result);
  32. fprintf(fin, "%c", result);
  33. }
  34. if (result == '!')
  35. goto ddd;
  36. }
  37. ddd:
  38. while (1)
  39. {
  40. anc = getch();
  41. if (anc == 27)
  42. goto breakall;
  43. }
  44. breakall:
  45. return 0;
  46. }
Вопрос вот какой, каким образом можно выполнить поиск соответствия одного значение другому? Перебор файла построчно я могу наверно выполнить как то так c помощью этой функции
Листинг программы
  1. fseek(file,0l,SEEK_SET);
, а затем каждую строчку мне видимо нужно будет читать посимвольно функцией типа
Листинг программы
  1. getchar()
и перебирать, находить там метку

#

, где заканчивается слово для поиска и где начинается ответная часть? По логике наверно так, а затем эту ответную часть записывать в другой текстовый файл и уже его потом отправлять обратно через сом порт прямо в виде текстового файла, так можно сделать? Текстовый файл соответствия наверно может быть примерно таким
Листинг программы
  1. SYST:COMM:SER:BAUD? # 1200
  2. READ:TS:BITR # 38E6
  3. SYST:KLOC #0
  4. SYSY:COMM:SER:PAR # 30
, а входной файл таким
Листинг программы
  1. SYST:COMM:SER:BAUD?
  2. READ:TS:BITR
  3. SYST:KLOC
  4. SYSY:COMM:SER:PAR
а выходной файл таким
Листинг программы
  1. 1200
  2. 38E6
  3. 0
  4. 30
Наверно непонятно получилось объяснить?

Решение задачи: «Как выполнить поиск в текстовом файле?»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. #define SIZE 256
  7.        int main(void)
  8. {
  9.    unsigned char result;
  10.    int port = 0x3F8;           /* serial port 1 */
  11.    int anc=0; int flag=0;
  12.    FILE *fin,*fout; char line[SIZE];
  13.  
  14.      char string[15];
  15.    char *ptr, c = '#';
  16.  fin=fopen("1.txt","w");
  17.  
  18.    printf("pusk\n");
  19.  
  20.    
  21.         outportb(port+3,0x80); /*set dlab on*/
  22.         outportb(port+1,0x00); /*starschiy bait scorosti*/
  23.         outportb(port+0,0x0C); /*scorosti mlads bait 9600*/
  24.         outportb(port+3,0x03);/* set dlab off,8bit,no perity,1 stop bit */
  25.         outportb(port+1,0x01);  /*preryvanie po priemu*/
  26.         inportb(port+3);    /*zadergka ignorirovan*/
  27.         outportb(port+2,0xC7); /*FIFO registr */
  28.         outportb(port+4,0x0b);  /*DTR,RTS,OUT2*/
  29.         inportb(port+0);    /*obnulenie bufera*/
  30.    
  31.  
  32.   while (flag==0)
  33.   {
  34.    result = inportb(port+2);
  35.     if  (result>195) /*pervoe cc posle priema iz labview*/
  36.     {
  37.        
  38.         result = inportb(port);
  39.        
  40.    ptr = strrchr(result, c);
  41.    strcpy(string, "This is # string");
  42.    ptr = strrchr(string, c);
  43.    if (ptr)
  44.       printf("The character %c is at position: %d\n", c, ptr-string);
  45.    else
  46.       printf("The character was not found\n");
  47.    
  48.     }
  49.   if (result=='!')
  50.   goto ddd;
  51.   } /*while*/
  52.     ddd:
  53.     while (1)
  54.     {
  55.     anc=getch();
  56.     if (anc==27)
  57.     goto breakall;
  58.     }
  59.  breakall:
  60.  
  61.    return 0;
  62.    }
  63.  /*main*/

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

  1. Включаем необходимые заголовочные файлы: , , , .
  2. Определяем размер буфера в 256 байт.
  3. Объявляем переменные:
    • result - для хранения результата чтения из порта.
    • port - для выбора порта (в данном случае 0x3F8 - serial port 1).
    • anc, flag - для контроля выполнения программы.
    • fin, fout - для работы с файлами.
    • line - для хранения строки, которую мы читаем из файла.
    • string - для хранения строки, в которой мы ищем символ.
    • ptr - указатель на символ, который мы ищем в строке.
    • c - символ, который мы ищем в строке.
  4. Открываем файл 1.txt в режиме записи (fopen(1.txt,w)).
  5. Выводим на экран команду для настройки порта (printf(pusk\n)).
  6. Настраиваем порт для работы:
    • Устанавливаем режим 8 бит, нет чётности, 1 стоповый бит (outportb(port+3,0x03)).
    • Устанавливаем начальный байт для приёма данных (outportb(port+1,0x01)).
    • Задаём скорость передачи данных (outportb(port+0,0x0C)).
  7. Входим в бесконечный цикл while (flag==0), который будет выполняться до тех пор, пока флаг не изменит своё значение.
  8. Внутри цикла считываем данные из порта и проверяем, если они больше 195, то это означает, что мы получили данные из LabView.
  9. Если полученный байт равен символу '#', то мы ищем этот символ в строке, которую мы храним в переменной string.
  10. Если символ найден, то выводим сообщение с его позицией в строке.
  11. Если символ не найден, то выводим сообщение об этом.
  12. Если полученный байт равен символу '!', то мы переходим к блоку кода, который находится после этого символа (goto ddd;).
  13. Если полученный байт равен 27, то мы выходим из программы (goto breakall;).
  14. Если флаг изменил своё значение, то мы выходим из цикла while (flag==0).
  15. Если anc равно 27, то мы выходим из программы (goto breakall;).
  16. Закрываем файл 1.txt (fclose(fin)).
  17. Возвращаем 0, что означает успешное выполнение программы (return 0).

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


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

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

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы