Следующий код является сокращенной формой, у меня есть две структуры с именем struct INTERFACE и struct node.
Для моей цели у меня есть 2 узла, и первый узел имеет два интерфейса, а второй узел имеет три интерфейса.
У меня есть один файл конфигурации, из которого мне нужно прочитать информацию и сохранить ее в вышеуказанных структурах.
Так что в моей основной программе while loop я читаю файл конфигурации с помощью strtok () fun и сохраняю соответственно.
В цикле if (if (strcmp ((p, "IP_ADDR_ETH") == 0) я сравнил токен IP-адреса, извлек IP-адрес и сохранил в интерфейсах каждого узла. Почему я использую регистр коммутатора, потому что если NODE -1 означает первый узел, NODE-2 означает второй узел.
Здесь я показан только для первого узла.
В цикле if я получаю IP-адрес первого узла и сохраняю его в значении интерфейса структуры узла.
от
(node1[i].node_if[a].ip_addr)= p;
//strcpy((node1[i].node_if[a].ip_addr),p);
printf("Node[%d] interface-eth[%d] address=%s \n\n", i,a,(node1[i].node_if[a].ip_addr) );
Внутри цикла while для каждого узла я могу получить доступ к структуре интерфейса и правильно получить значение ipaddr.
Но вне цикла while, если я печатаю значения интерфейса каждого узла, я получаю только последнее значение интерфейса второго узла, я не могу правильно получить IP-адрес интерфейса каждого узла.
Моя часть основного кода выглядит следующим образом, извините, если длина кода еще раз, но я дал только только необходимую часть,
/* Node information structure. */
typedef struct node {
char name[20];
char val[20];
char OS[10];
int vm_id;
int num_if;
//char *OS;
if_val1 node_if[10];
long int memsize;
}node1;
/* Interfaces definition structure. */
typedef struct INTERFACE {
char *ip_addr;
char *netmask;
char *gateway;
} if_val1,if_val2;
I have the above two structure.
/* File pointer .*/
FILE *f;
int main()
{
node1 nodeuse;
node1 node1[20];
//if_val1 if_val[10];
if_val1 zero_ifintf;
//int a;
f=fopen("test.config","r");
if(!f)
return 1;
while(fgets( string, sizeof(string)-1, f) != NULL)
{
/* Break into tokens. */
p = string;
p = strtok( string, seps ); /* Find first token*/
while( p != NULL )
{
if (strcmp(p,"NODE")==0)
{
a = atoi (strtok( NULL, seps )); /* Find next token*/
switch (a)
{
case 1:
{
int i=0;
if(strcmp(p,"IP_ADDR_ETH")==0)
{
printf("--------------hi1 \n");
int comp,a;
printf("------------hi2 \n");
a = atoi (strtok( NULL, seps )); /* Find next token*/
if(a < (node1[i].num_if))
{
printf("-------------hi3 \n");
p = strtok( NULL, seps ); /* Find next token*/
(node1[i].node_if[a].ip_addr)= p;
//strcpy((node1[i].node_if[a].ip_addr),p);
printf("Node[%d] interface-eth[%d] address=%s \n\n", i,a,(node1[i].node_if[a].ip_addr) );
}
printf("---------------------hi4 \n");
}
i++;
}
}} //end of while loop
//outside while loop printf 's
printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",1,0,(node1[0].node_if[0].ip_addr));
printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",1,1,(node1[0].node_if[1].ip_addr));
printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,0,(node1[1].node_if[0].ip_addr));
printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,1,(node1[1].node_if[1].ip_addr));
printf("NODE[%d] INTERFACE-ETH-[%d] ADDRESS: %s \n",2,2,(node1[1].node_if[2].ip_addr));
почему значения структуры не распечатаны должным образом.
также я пытаюсь присвоить значение строки токена другой строке, используя функцию strcpy (). Но когда произошла ошибка сегментации компиляции. Можно ли объявить char * string и assing value с помощью strcpy ()?.
мой конфигурационный файл следующим образом,
[Test.config]
TYPE VM vm1
TYPE PM pm1
NODES 2
APS 2
TYPE wired
NODE-1 NUM_IF 2
NODE-1 IP_ADDR_ETH-0 10.114.12.1
NODE-1 IP_ADDR_ETH-1 10.114.12.2
NODE-1 VM_ID 1
NODE-1 MEM_SIZE 512
NODE-1 OS FEDORA
NODE-2 NUM_IF 3
NODE-2 IP_ADDR_ETH-0 10.114.14.1
NODE-2 IP_ADDR_ETH-1 10.114.14.2
NODE-2 IP_ADDR_ETH-2 10.114.14.3
NODE-2 VM_ID 2
NODE-2 MEM_SIZE 1GB
NODE-2 OS CENTOS
NODE-2 10.114.12.7
* * Тысяча двадцать-одина [/ test.config] * * тысяча двадцать две
Спасибо,
Arun