Как выполнить поиск в текстовом файле? - 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).