Читать из файла и хранить в структуре - PullRequest
1 голос
/ 12 мая 2011

Я хочу скопировать эти данные @ 822! 172.28.6.137! 172.28.6.110! 5000! 6000 |сформируйте файл input_data для этой структуры, чтобы скопировать 822 из файла в input.key и 172.28.6.137 в src_ip когда-либо!это должно скопировать данные из файла следующему члену структуры, как это сделать?

struct input_par
{
    char key[5];
    char src_ip[15];
    char dst_ip[15];
    char src_port[5];
    char dst_port[5];
};

main()
{
    int i;
    char ch;
    FILE *fp;
    struct input_par input;
    fp = fopen("input_data","r");
    if(fp == NULL)
    printf("file open failed \n");
    else
    {
        ch = fgetc(fp);
        if(ch=='@')
            printf("data is valid\n");
        fseek(fp,1,1);
        while(ch!='|')
        {
            input.key      =
            input.src_ip   =
            input.dst_ip   =
            input.src_port =
            input.dst_port =
        }       
    }

Ответы [ 4 ]

1 голос
/ 12 мая 2011

Вы можете использовать регулярные выражения, см. Regexp.h из libstd

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

(также проще использовать fscanf)

1 голос
/ 12 мая 2011

Вы можете использовать fscanf .Я бы сделал что-то вроде:

struct input_par {
    char key[5];
    char src_ip[15], dst_ip[15];
    int src_port;
    int dst_port;
}

struct input_par ip;

if ( fscanf(fp, "@%s!%s!%s!%d!%d", 
           ip.key, ip.src_ip, ip.dst_ip, ip.src_port, ip.dst_port) != 5 )
      do_error();
0 голосов
/ 12 мая 2011

Вызов fscanf выполнит эту работу:

fscanf(fp, "@%[0-9]!%[0-9.]!%[0-9.]!%[0-9]!%[0-9]|", input.key, input.src_ip, input.dst_ip, input.src_port, input.dst_port);

Обратите внимание, что сначала вы должны убедиться, что входные строки не переполняют поля массива.

0 голосов
/ 12 мая 2011

Во-первых, давайте иметь функцию, которая читает одно поле (хотя она не обнаружит частично прочитанные поля)

int read_field(FILE *f,char *destination,size_t max_len)
{
   int c;
   size_t count = 0;
   while(c = fgetc(f)) != EOF) {
     if(c == '!' || c == '|')
        break;
     if(count < max_len - 1)
         destination[count++] = c;
    }

   destination[count] = 0;
   return count;
}

Затем прочитайте поля:

  int ch = fgetc(fp);
  if(ch=='@') {
     int ok;
     printf("data is valid\n");
     ok = get_field(fp,input.key,sizeof input.key);
     ok && get_field(fp,input.src_ip,sizeof input.src_ip);
     ok && get_field(fp,input.dst_ip,sizeof input.dst_ip);
     ok && get_field(fp,input.src_port,sizeof input.src_port);
     ok && get_field(fp,input.dst_port,sizeof input.dst_port);
     if(!ok) {
        puts("parse error");
     }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...