我想加载一个代理列表,用':'分隔符拆分每一行,然后将其加载到一个结构中:
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 );
}
但编译时我遇到很多错误。
如何将每一行加载到结构中?
答案 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()
是错误的。对于port
和type
,它应该是
fscanf( in, "%hu ", &temp->... );
如果要扫描一个短整数,对于ip
,您必须在调用fscanf()
之前分配内存。此外,您不应将feof()
与fcanf()
一起使用。搜索SO,你会发现很多相关信息。