Как выполнить поиск в текстовом файле? - C (СИ)
Формулировка задачи:
Прочитал код через сом порт и записал его в текстовый файл, а теперь мне нужно этот код (из текстового файла ) перебрать распознать и выдать обратно через сом порт некие команды, в зависимости от тех данных которые были получены ранее, вот код, который я использую для чтение, собственно там нет ничего интересного код как код.
Вопрос вот какой, каким образом можно выполнить поиск соответствия одного значение другому? Перебор файла построчно я могу наверно выполнить как то так c помощью этой функции , а затем каждую строчку мне видимо нужно будет читать посимвольно функцией типа и перебирать, находить там метку , а входной файл таким а выходной файл таким
#include <stdio.h> #include <dos.h> #include <conio.h> #include <ctype.h> int main(void) { unsigned char result; int port = 0x3F8; /* serial port 1 */ int anc = 0; int flag = 0; FILE* fin; fin = fopen("1.txt", "w+"); printf("pusk\n"); outportb(port + 3, 0x80); /*set dlab on*/ outportb(port + 1, 0x00); /*starschiy bait scorosti*/ outportb(port + 0, 0x0C); /*scorosti mlads bait 9600*/ outportb(port + 3, 0x03); /* set dlab off,8bit,no perity,1 stop bit */ outportb(port + 1, 0x01); /*preryvanie po priemu*/ inportb(port + 3); /*zadergka ignorirovan*/ outportb(port + 2, 0xC7); /*FIFO registr */ outportb(port + 4, 0x0b); /*DTR,RTS,OUT2*/ inportb(port + 0); /*obnulenie bufera*/ while (flag == 0) { result = inportb(port + 2); if (result > 195) /*pervoe cc posle priema iz labview*/ { result = inportb(port); printf("%c", result); fprintf(fin, "%c", result); } if (result == '!') goto ddd; } ddd: while (1) { anc = getch(); if (anc == 27) goto breakall; } breakall: return 0; }
fseek(file,0l,SEEK_SET);
getchar()
#
, где заканчивается слово для поиска и где начинается ответная часть? По логике наверно так, а затем эту ответную часть записывать в другой текстовый файл и уже его потом отправлять обратно через сом порт прямо в виде текстового файла, так можно сделать? Текстовый файл соответствия наверно может быть примерно такимSYST:COMM:SER:BAUD? # 1200 READ:TS:BITR # 38E6 SYST:KLOC #0 SYSY:COMM:SER:PAR # 30
SYST:COMM:SER:BAUD? READ:TS:BITR SYST:KLOC SYSY:COMM:SER:PAR
1200 38E6 0 30
Наверно непонятно получилось объяснить?
Решение задачи: «Как выполнить поиск в текстовом файле?»
textual
Листинг программы
#include <stdio.h> #include <dos.h> #include <conio.h> #include <string.h> #define SIZE 256 int main(void) { unsigned char result; int port = 0x3F8; /* serial port 1 */ int anc=0; int flag=0; FILE *fin,*fout; char line[SIZE]; char string[15]; char *ptr, c = '#'; fin=fopen("1.txt","w"); printf("pusk\n"); outportb(port+3,0x80); /*set dlab on*/ outportb(port+1,0x00); /*starschiy bait scorosti*/ outportb(port+0,0x0C); /*scorosti mlads bait 9600*/ outportb(port+3,0x03);/* set dlab off,8bit,no perity,1 stop bit */ outportb(port+1,0x01); /*preryvanie po priemu*/ inportb(port+3); /*zadergka ignorirovan*/ outportb(port+2,0xC7); /*FIFO registr */ outportb(port+4,0x0b); /*DTR,RTS,OUT2*/ inportb(port+0); /*obnulenie bufera*/ while (flag==0) { result = inportb(port+2); if (result>195) /*pervoe cc posle priema iz labview*/ { result = inportb(port); ptr = strrchr(result, c); strcpy(string, "This is # string"); ptr = strrchr(string, c); if (ptr) printf("The character %c is at position: %d\n", c, ptr-string); else printf("The character was not found\n"); } if (result=='!') goto ddd; } /*while*/ ddd: while (1) { anc=getch(); if (anc==27) goto breakall; } breakall: return 0; } /*main*/
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , . - Определяем размер буфера в 256 байт.
- Объявляем переменные:
- result - для хранения результата чтения из порта.
- port - для выбора порта (в данном случае 0x3F8 - serial port 1).
- anc, flag - для контроля выполнения программы.
- fin, fout - для работы с файлами.
- line - для хранения строки, которую мы читаем из файла.
- string - для хранения строки, в которой мы ищем символ.
- ptr - указатель на символ, который мы ищем в строке.
- c - символ, который мы ищем в строке.
- Открываем файл
1.txt
в режиме записи (fopen(1.txt
,w
)). - Выводим на экран команду для настройки порта (printf(
pusk\n
)). - Настраиваем порт для работы:
- Устанавливаем режим 8 бит, нет чётности, 1 стоповый бит (outportb(port+3,0x03)).
- Устанавливаем начальный байт для приёма данных (outportb(port+1,0x01)).
- Задаём скорость передачи данных (outportb(port+0,0x0C)).
- Входим в бесконечный цикл while (flag==0), который будет выполняться до тех пор, пока флаг не изменит своё значение.
- Внутри цикла считываем данные из порта и проверяем, если они больше 195, то это означает, что мы получили данные из LabView.
- Если полученный байт равен символу '#', то мы ищем этот символ в строке, которую мы храним в переменной string.
- Если символ найден, то выводим сообщение с его позицией в строке.
- Если символ не найден, то выводим сообщение об этом.
- Если полученный байт равен символу '!', то мы переходим к блоку кода, который находится после этого символа (goto ddd;).
- Если полученный байт равен 27, то мы выходим из программы (goto breakall;).
- Если флаг изменил своё значение, то мы выходим из цикла while (flag==0).
- Если anc равно 27, то мы выходим из программы (goto breakall;).
- Закрываем файл
1.txt
(fclose(fin)). - Возвращаем 0, что означает успешное выполнение программы (return 0).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д