将文件内容加载到结构中

时间:2013-08-02 10:41:05

标签: c struct

我想加载一个代理列表,用':'分隔符拆分每一行,然后将其加载到一个结构中:

struct proxy_data {
    ushort type; 
    char *ip;
    uint16_t port;
};


void load_proxies( char * proxy_file )
{
    FILE * in;
    struct proxy_data * temp = NULL;
    if( ( in = fopen( proxy_file, "rt") ) == NULL )
    {
         fprintf( stderr, "\nCan't open input file!\n");
         exit( 0 );
    }
    while( !feof( in ) )
    {
         temp = malloc( sizeof( struct proxy_data ) );
         fscanf(in, "%s ",temp->type);
         fscanf(in, "%s ",temp->ip);
         fscanf(in, "%s ",temp->port);
    };
    fclose( in );
}

但编译时我遇到很多错误。

如何将每一行加载到结构中?

3 个答案:

答案 0 :(得分:0)

使用

struct proxy_data {
unsigned short type; 
char *ip;
unsigned short port;
};

c中没有ushort或uint16。

或添加

#include <stdint.h>

在您的计划开始

也不要忘记使用ip wizely,这样你就不会通过在放入值之前分配ip来获得对未分配内存的无效引用。阅读this

答案 1 :(得分:0)

您不能只将struct写入文件,并期望它们可以处理除最简单的情况之外的任何事情。它们是特定于平台的(考虑整数大小和字节序问题),如果它们包含指向内存其他部分的指针,那些成员在读入时将变为孤立状态,从而导致崩溃。

您尝试解决的问题称为marshalling,基本上是如何将内部数据结构序列化为外部数据结构(即文件或网络)并从中反序列化。

如果您正在使用C ++或Java(您似乎不是,那么它会出现),那么请考虑使用Google Protocol Buffers等解决方案,这样可以简化此过程。

如果您必须编写自己的解决方案,那么您需要将函数从字符串转换为struct的实例,例如:

int decode_proxy_data(const char *string, proxy_data *data) {
    unsigned type, port;
    char ip[32];
    if (sscanf(string, "%u %s %u", &type, ip, &port) == 3) {
        data->type = (ushort)type;
        data->ip = strdup(ip);     // This must be free()'d during destruction!
        data->port = (uint16_t)port;
        return TRUE;
    }
    return FALSE;
}

int encode_proxy_data(char *string, const proxy_data *data) {
    sprintf(string, "%u %s %u", (unsigned)data->type, data->ip, (unsigned)data->port;
    return TRUE;
}

然后你可以读/写文件的字符串,这个代码几乎可以在任何平台上运行(当然,它没有经过测试)。

请注意proxy_data.ip需要内存管理(即您必须在其上调用free()以避免内存泄漏),但无论如何,无论您的编组问题如何,都是如此。

如果您有选择,请切换到C ++。

答案 2 :(得分:0)

假设您的proxy_dile具有正确的结构(例如,als值以文本形式存储),那么您的fscanf()是错误的。对于porttype,它应该是

fscanf( in, "%hu ", &temp->... ); 

如果要扫描一个短整数,对于ip,您必须在调用fscanf()之前分配内存。此外,您不应将feof()fcanf()一起使用。搜索SO,你会发现很多相关信息。