我正在实现此代码,但我收到错误。
http://curl.haxx.se/libcurl/c/ftpupload.html
错误出现在这段代码中。
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
curl_off_t nread;
/* in real-world cases, this would probably get this data differently
as this fread() stuff is exactly what the library already would do
by default internally */
size_t retcode = fread(ptr, size, nmemb, stream);
nread = (curl_off_t)retcode;
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
" bytes from file\n", nread);
return retcode;
}
错误是......
IntelliSense: argument of type "void *" is incompatible with parameter of type "FILE *"
和
Error C2664: 'fread' : cannot convert parameter 4 from 'void *' to 'FILE *'
任何提示都会有用。我不明白为什么我们要将void *流传递给函数。那有什么意思?指向虚空的指针?
在这里被称为。
/* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
CURL API
CURLOPT_READFUNCTION
将指针传递给与以下原型匹配的函数: size_t函数(void * ptr,size_t size,size_t nmemb,void *用户数据);一旦需要读取数据以便将其发送给对等体,libcurl就会调用此函数。数据区指向 通过指针ptr可以填充最多大小乘以 nmemb字节数。您的函数必须返回实际的数字 存储在该内存区域中的字节数。返回0将发出信号 文件结束到库并导致它停止当前传输。
如果你通过“早熟”返回0来停止当前转移(即 在服务器预期之前,就像你说过你会上传N一样 字节,你上传少于N个字节),你可能会体验到 服务器“挂起”等待其他未来的数据。
读回调可能返回CURL_READFUNC_ABORT以停止当前 立即操作,导致CURLE_ABORTED_BY_CALLBACK错误 来自转移的代码(在7.12.1中添加)
从7.18.0开始,该函数可以返回CURL_READFUNC_PAUSE 将导致从此连接读取暂停。看到 curl_easy_pause(3)了解更多详情。
错误:在进行TFTP上传时,您必须返回确切的数量 回调想要的数据,或者它将被视为最终的数据 服务器端的数据包,传输将在那里结束。
如果将此回调指针设置为NULL,或者根本不设置它,则 将使用默认内部读取功能。它正在做一个fread() 使用CURLOPT_READDATA设置FILE * userdata。
我有点超出我的深度。
答案 0 :(得分:0)
fread
将FILE*
作为第四个参数,void*
不匹配。假设在将参数传递给参数之前,流的参数是FILE*
,则需要将其转换为:
fread(..., (FILE*)stream);
BTW reinterpret_cast
在语义上更适合此任务:
fread(..., reinterpret_cast<FILE*>(stream));
void*
是一种通用指针类型,可以转换为任何其他指针类型。
答案 1 :(得分:0)
如果您的程序是用C语言编写的,那么代码就是有效的,因为在C类型void *
中可以隐式转换为任何类型的指针。但是,C ++不允许将void *
隐式转换为任何其他类型的指针。因此,您需要明确指定要转换类型为void *
您可以使用C样式转换或C ++样式转换。例如
size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);
或
size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>( stream ));