Member 12089703 Ответов: 1

Перейдите к следующей строке файла, если встречается запятая ( , ), и продолжите поиск в C


Я строил что-то вроде симулятора брандмауэра. Очевидно, я добавлю набор правил.Поэтому я использую файл .txt для своих правил. Примеры записей txt :

HOST_IP, HOST_PORT, DEST_IP, DEST_PORT
192.168.1.100, 32, 127.0.0.1, 567
192.168.1.101, 32, 127.0.0.1, 09
192.168.1.102, 32, 127.0.0.1, 64
192.168.1.103, 32, 127.0.0.1, 56

Поэтому я хочу, чтобы, если файл ищет ip-адрес хоста, он сначала искал все IP-адреса хоста. Как только встречается запятая ( ,), указатель переходит на следующую строку и проверяет IP-адрес (перед первой запятой) во второй строке. Если он найден, он должен вернуться, иначе он должен перейти к следующей строке после того, как он встретит запятую (,) и искать IP-адрес в следующей строке.

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>
   main( )
   {
     FILE *fp;
     char c[20],*string;
     fp = fopen("test.txt", "r");
     if (fp == NULL)
		printf("File doesn't exist\n");
     else {
      do {
       fscanf(fp,"%s",string);
	t=getc(fp);
	
	
		if(strcmp(string,c)){printf("Found");fclose(fp);}
		if(t==",")//here i need to jump to next line

        	 putchar(c); /* display it on the monitor
       		*/
       	
	} while (c != EOF); /* repeat until EOF (end of file)
     */
     }
    fclose(fp);
   }

Jochen Arndt

Я предлагаю использовать другой подход:

Загрузите полное содержимое файла в память и обработайте его там. Это будет намного проще, чем использовать операции на основе файловых дескрипторов. Обратите внимание, что использование строковых функций в таких буферах требует выделения еще одного байта и установки его (последнего) в ноль.

Затем используйте strchr (), strstr () и, возможно, strpbrk () и strrchr (), чтобы найти интересующие позиции.

Например:
Если у вас есть интересная позиция и вы хотите перейти к следующей строке, найдите следующее вхождение '\n' с помощью strchr() и добавьте его, если оно найдено.

Suvendu Shekhar Giri

В чем проблема с кодом, который вы пробовали?

«_Superman_»

Поскольку вы используете C++, я рекомендую вам взглянуть на регулярные выражения (std:: regex).

1 Ответов

Рейтинг:
2

Richard MacCutchan

Не используйте fscanf, но использовать fgets читать по одной строчке за раз. Затем вы можете маркировать линию (используя strtok) для проверки отдельных полей.


Member 12089703

#include & lt;string.h>
#include < stdio.h>

тап_п()
{
Файл *fp;
char str[20], * string, t[20];
fp = fopen("test.txt", " Р");
if (fp = = NULL)
printf ("файл не существует\n");
ещё{
в то время как (! feof(fp)){

if (fgets(str, 20, fp)!=NULL){

const char s[2] = ",";
символ *знак;

/ * получить первый токен */
токен = strtok(str, s);

/ * пройдите через другие токены */
а( знак != Нуль )
{
printf ("%s\n", токен );
токен = strtok(NULL, s);
}
}
}}
возврат (0);
}



Поэтому я сделал то, о чем ты меня просил.
И что теперь?.. Как я могу читать только первое поле каждой строки? Только первая строчка.?

Richard MacCutchan

Если вы действительно серьезно относитесь к созданию симулятора брандмауэра, как указано в вашем вопросе, то вам действительно нужно потратить гораздо больше времени на изучение языка, который вы планируете использовать. Все эти функции полностью документированы в MSDN: Манипуляция строками (ЭЛТ)[^]

Member 12089703

Я делал это как свой школьный проект, и в соответствии с моими школьными правилами мне было запрещено использовать только язык Си для проекта этого семестра.
Если вы можете помочь, я буду вам очень признателен.

Richard MacCutchan

Вам нужно перейти по ссылке, которую я вам дал, и изучить строковые функции, которые помогут вам прочитать и разобрать ваш файл. Вам нужно понять основы, прежде чем вы сможете написать более продвинутую программу. И вы научитесь гораздо быстрее, читая документацию, чем размещая вопросы здесь.