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 が指すデータ領域は、最大で 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 に設定するか、まったく設定しない場合、デフォルトの内部読み取り関数が使用されます。CURLOPT_READDATA で設定された FILE * userdata に対して fread() を実行しています。

私は私の深さから少し外れています。

4

2 に答える 2

0

プログラムが C で記述されている場合、C では型void *を任意の型のポインターに暗黙的に変換できるため、コードは有効です。void *ただし、C++ では、他の型のポインターに暗黙的に変換することはできません。したがって、タイプのオブジェクトを変換したいものにタイプを明示的に指定する必要があります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 に答える
0

freadFILE*は4 番目の引数としてa を取りますが、avoid*は一致しません。パラメータに渡す前に stream への引数が a であったと仮定すると、次のFILE*ようにキャストする必要があります。

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

ところで areinterpret_castは、このタスクにより意味的に適切です。

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

Avoid*は、他の任意のポインター型に変換可能なジェネリック ポインター型です。

于 2014-02-15T13:21:02.447 に答える