0

我正在实现此代码,但收到错误消息。

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 *stream 传递给函数。那有什么意思?指向空的指针?

它在这里被调用。

/* we want to use our own read function */ 
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

卷曲 API

CURLOPT_READFUNCTION

传递一个指向与以下原型匹配的函数的指针: size_t function( void *ptr, size_t size, size_t nmemb, void *userdata); 当 libcurl 需要读取数据以便将其发送到对等方时,该函数就会被调用。指针 ptr 指向的数据区域最多可以用 size 乘以 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)。

Bugs:在进行TFTP上传时,必须返回回调想要的确切数据量,否则将被服务器端视为最终数据包,传输将在那里结束。

如果将此回调指针设置为 NULL,或者根本不设置,将使用默认的内部读取函数。它正在使用 CURLOPT_READDATA 对 FILE * userdata 集执行 fread()。

我有点超出我的深度。

4

2 回答 2

0

fread将 aFILE*作为其第四个参数, avoid*不匹配。假设流的参数是 aFILE*在将其传递给参数之前,您需要对其进行强制转换:

 fread(..., (FILE*)stream);

BTW areinterpret_cast在语义上更适合此任务:

fread(..., reinterpret_cast<FILE*>(stream));

Avoid*是可转换为任何其他指针类型的通用指针类型。

于 2014-02-15T13:21:02.447 回答
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 ));
于 2014-02-15T13:41:41.647 回答