0

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

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

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

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

4

3 回答 3

0

利用

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

c 中没有 ushort 或 uint16。

或添加

#include <stdint.h>

在您的程序开始时

也不要忘记使用ipwizely,这样您就不会通过在将值放入其中之前分配 ip 来获得对未分配内存的无效引用。读这个

于 2013-08-02T10:45:12.680 回答
0

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

您要解决的问题称为编组,基本上是如何将内部数据结构序列化到外部数据结构(即文件或网络)以及从外部数据结构(即文件或网络)中反序列化。

如果您使用的是 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++。

于 2013-08-02T11:02:27.723 回答
0

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

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

由于您要扫描一个短整数,因此ip您必须在调用之前分配内存fscanf()。此外,您永远不应该feof()fcanf(). 搜索SO,你会发现很多关于它的信息。

于 2013-08-02T11:19:32.573 回答