Как выполнить поиск в текстовом файле? - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д