从文件中读取并存储在结构中

发布于 2024-11-06 21:33:12 字数 798 浏览 0 评论 0原文

我想复制此数据@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 =
        }       
    }

i want to copy this data @822!172.28.6.137!172.28.6.110!5000!6000| form file input_data to this structure,to copy 822 from the file to input.key and 172.28.6.137 to src_ip when ever ! is encountered it should copy the data from file to next member of the structure how to do this?

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 =
        }       
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乖乖 2024-11-13 21:33:12

您可以使用正则表达式,请参阅 libstd 中的 regexp.h

如果您必须在这里使用这种东西,您可以直接遍历 char[] 并计算!并根据您之前看到的内容添加您在正确部分中阅读过的字符。

(而且 fscanf 更容易)

You can use regular expressions see regexp.h from libstd

If you just have to use this kind of thing here, you can juste go through your char[] and count the ! and depending and how much you have previously seen you add the chars you've read in the correct section.

(also fscanf is easier)

檐上三寸雪 2024-11-13 21:33:12

您可以使用 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();

You can use fscanf. I would do something like:

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();
┈┾☆殇 2024-11-13 21:33:12

首先,让我们有一个读取一个字段的函数(尽管它不会检测部分读取的字段)

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");
     }
  }

First, let's have a function which reads one field(though it won't detect partially read fields)

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;
}

Then read the fields:

  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");
     }
  }
陌上青苔 2024-11-13 21:33:12

调用 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);

请注意,您首先必须确保输入字符串不会溢出数组字段。

A call to fscanf will do the job:

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);

Note that you first have to make sure that the input strings do not overflow your array fields.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文