2011-05-16 52 views
1

我的文本文件是这样的(文件中的数据也可以增加)读取文本文件转换成一个结构

822 
    172.28.6.56 
    172.34.34.53 
    3244 
    5434 

    844 
    192.150.160.145 
    192.67.45.123 
    2344 
    234 


    700 
    192.13.56.6 
    192.89.95.3 
    4356 
    3566 

    522 
    172.28.6.137 
    172.28.6.110 
    2543 
    5245 

    900 
    255.255.255.255 
    244.244.244.244 
    2435 
    3245 

,我的结构是这样的

struct input_par 
    { 
    int key_node; 
    char src_ip[15]; 
    char dst_ip[15]; 
    int src_port; 
    int dst_port; 
    }; 

我必须填写从这个数据存储struture在文件中,一旦它完成输入5个承包商,客人I结构具有这样的结构发送给功能 即,我填充

822 
    172.28.6.56 
    172.34.34.53 
    3244 
    5434 
012的结构

然后我这种结构发送给一个函数,它发送到功能后,我应该再次输入与文件中的下一个数据结构即

844 
    192.150.160.145 
    192.67.45.123 
    2344 
    234 

我必须继续这样做,直到我EOF到达。 我用fscanf它不能正常工作如何做到这一点?请帮助

+6

请邮寄到现在为止您编写的代码。人们通常不喜欢只为你写代码。事实上,这是一个工作描述,而不是一个问题。 – 2011-05-16 06:54:05

+0

如果数组将被视为字符串,那么它应该有1个字节。如果他们不被视为字符串,你需要更好的地址编码规范。 – pmg 2011-05-16 09:02:51

回答

0

只要实际上每个这些结构之间只有一个空间......我可能会这样做。这很丑陋,但只要你知道你的最大行大小和文件结构没有任何打嗝(额外的空白行等),就可以完成工作。否则,如果出现异常情况,最好编写更好的代码来处理和中断/返回。

作为注释注释,您需要确保增加char数组以便在最后解释'\ n'。以下是我最初发布的内容的一些修改。请注意,如果行结尾是基于Windows的(我相信),这可能会中断。我添加了一些小技巧来解决数组空间和\ n字符的问题。

struct input_par 
{ 
int key_node; 
char src_ip[21]; 
char dst_ip[21]; 
int src_port; 
int dst_port; 
}; 


FILE* file = fopen("inputfile.txt", "r"); 
char linebuffer[21]; //a little extra room here than needed, presumably... 
struct input_par ip; 
int i = 0, l = 0; 

while(fgets(linebuffer, 20, file)) 
{ 
    ip.key_node = atoi(linebuffer); 
    fgets(linebuffer, 20, file); 
    strcpy(ip.src_ip, linebuffer); 

    l = strlen(linebuffer); 
    for(i = 0; i < l; ++i){ 
     if(linebuffer[i] == '\n'){ 
     linebuffer[i] = '\0' 
     break; 
     } 
    } 

    fgets(linebuffer, 20, file); 
    strcpy(ip.dest_ip, linebuffer); 

    l = strlen(linebuffer); 
    for(i = 0; i < l; ++i){ 
     if(linebuffer[i] == '\n'){ 
     linebuffer[i] = '\0' 
     break; 
     } 
    } 

    fgets(linebuffer, 20, file); 
    ip.src_port = atoi(linebuffer); 
    fgets(linebuffer, 20, file); 
    ip.dst_port = atoi(linebuffer); 
    fgets(linebuffer, 20, file); //get the empty line 
} 
+0

这里的错字:'ip.dst_port - atoi(linebuffer);'')' – MByD 2011-05-16 07:09:27

+0

您正在写入“ip”数组的最后一个元素之后。在15个字符的IP地址的情况下,strcpy会尝试将16个字节(甚至17个换行符)写入15个长度的阵列。 – pmg 2011-05-16 09:03:21

+0

fscanf呢? – 2011-05-16 13:57:29

0

可以读取整个结构在一个呼叫FSCANF

--->

while(!feof(fp)) 
{ 
    input_par ip; 
    int ret = fscanf(fp,"%*[ \t\n]%d%*[ \t\n]%s%*[ \t\n]%s%*[ \t\n]%d%*[ \t\n]%d",&ip.key_node,&ip.src_ip,&ip.dst_ip,&ip.src_port,&ip.dst_port); 
    if (ret !=5) 
    { 
     //skip this record 
     continue; 
    } 
    //process record ip 
} 
相关问题