2011-05-12 6 views
1

이 데이터를 복사하고 싶습니다 @ 822! 172.28.6.137! 172.28.6.110! 5000! 6000 | 이 구조체에 파일 input_data를 작성하면 파일에서 input.key로 822를 복사하고 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 = 
     }  
    } 

답변

1

fscanf을 사용할 수 있습니다. 내가 좋아하는 뭔가를 할 것이다 : 당신이 여기 이런 종류의 일을 사용해야하는 경우 당신은 정규 표현식 libstd

에서 regexp.h 볼 수 있습니다

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

fscanf를 사용하는 것처럼 말했지만 오류 오류가 발생합니다. 'char [5]'형식에서 'int'형식으로 할당 할 때 호환되지 않는 형식이고이 구조체에 많은 데이터를 입력해야하므로 fscanf를 사용하여 완료 할 수 있습니다. @ 822와 같은 루프에 넣음으로써! 172.28.6.137! 172.28.6.110! 5000! 6000 | @ 832! 172.28.6.17! 172.28.6.110! 5003! 600 | @ 852! 172.28.6.17! 172.28.6.110! 5003! 600 | 그리고 때마다 나는이 데이터를 입력하고 다른 함수에 구조체를 전달해야한다. – sandeep

1

을, 당신이 juste 수있는 문자를 통해 이동 []와 카운트! 그리고 이전에 얼마나 많이 보았는지는 올바른 섹션에서 읽은 문자를 추가하는 것입니다.

(도 fscanf는 쉽게)

+0

내가 말한 것처럼 fscanf를 사용했지만 에러가 발생한다 : 타입 'int [int]'에서 'char [5]'타입으로 할당 할 때 호환되지 않는 타입이있다. 이 구조체에 많은 데이터를 입력하려면 fscanf를 @ 822와 같은 루프에 넣으면됩니다! 172.28.6.137! 172.28.6.110! 5000! 6000 | @ 832! 172.28.6.17! 172.28.6.110! 5003! 600 | @ 852! 172.28.6.17! 172.28.6.110! 5003! 600 | 이 데이터를 입력하고 구조체를 다른 함수에 전달할 때마다 – sandeep

+0

fscanf의 반환 값은 변환 된 항목의 수를 반환하므로 반환 값을 char 배열에 할당 할 수 없습니다 – Habalusa

0

먼저, (그것이 부분적으로 읽기 필드를 검색하지 않습니다하지만) 하나 개의 필드를 읽는 기능

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

작업 할 것 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); 
0123을

먼저 입력 문자열이 배열 필드를 오버플로하지 않도록해야합니다.

관련 문제