我有一个问题,我认为我可以在几秒钟内解决,但我似乎无法弄明白。
我想要实现的是为我的程序创建一个配置,并在我的文件中一次保存所有设置,而不会产生太多开销。
过去我可以使用snprintf手动创建结构,将整数传递给一个先前由内存分配并直接将其写入文件的char *,但现在不是那样,我宁愿使用一个扁平的结构所以如果我想直接修改值,我可以代替使用snprintf和atoi函数将字符串转换为数字,反之亦然。
我在编写apache模块时使用apr_file函数打开文件。
这是我失败的尝试:
typedef struct{
unsigned int setting1;
unsigned int setting2;
} allsettings;
void read_a_file(request_rec *r){
allsettings *arecord; //compiler didn't complain at this line but might have caused segfault
apr_file_t *f;
const int perm=0x0755,ior=APR_FOPEN_READ|0,iow=APR_FOPEN_WRITE|APR_FOPEN_CREATE|0;
if (apr_file_open(&f,strres,ior,perm,r->pool)==APR_SUCCESS){
rv=apr_file_gets(arecord,sizeof(arecord),f);
rv=apr_file_close(f);
}
}
编译完成后,我收到了以下错误,我正在努力解决这个错误:
warning: passing argument 1 of 'apr_file_gets' from incompatible pointer type
但是,我通过使用char *来强制转换参数1来消除该警告。
有没有一种简单的方法可以将文件加载到函数的两个局部整数中,而无需进行任何字符串转换或为函数分配额外的内存而不会收到分段错误?
答案 0 :(得分:0)
首先,arp_file_gets()从文件中获取一个字符串。我相信你必须从你输出的字符串中解析你想要的东西。
在发布的代码段中你还需要注意一些事项:
1. arecord指针未分配,因此传递给arp_file_gets
的指针是无效指针。
2.在此调用中: rv=apr_file_gets(arecord,sizeof(arecord),f);
我明白您需要从文件f中读出2个unsigned int。但 sizeof(arecord) = 4 (bytes)
作为指针的大小(不是结构大小)。
答案 1 :(得分:0)
apr_file_gets“从指定文件中读取一行”(Apache Portable Runtime - File I/O Handling Functions。
编译时,您收到警告,因为不允许从struct *类型隐式强制转换为类型char * (或仅允许您收到警告)。如果你想这样做,你必须明确地施展它:
rv=apr_file_gets((char*)arecord,sizeof(arecord),f);
但是,您的代码存在以下问题:
1。)错过了记录指针的内存分配。可能的解决方案如下:
allsettings arecord;
...
rv=apr_file_gets((char*)&arecord,sizeof(arecord),f);
2。)但主要的问题是你尝试使用为字符/字符串读取创建的文件读取器方法来进行二进制读取。例如,如果您的文件是“1234”字符串而不是apr_file_gets方法,您将获得一个值为0x34333231 = 875770417,不 1234的整数。要避免该问题,您必须实现解析方法。