2017-07-09 153 views
0

libssh2 libを使用して、デバイスとSFTPセッションを確立しています。libssh2 - SFTPでファイルを読み取る

しかし、ファイルを読み込んで出力を返そうとすると、完全なファイルは返されません。

ファイルの途中で制御文字(\0など)があると思います。

コード:

sftp_handle = libssh2_sftp_open(sftp_session, filename, LIBSSH2_FXF_READ, 0); 
if (!sftp_handle) return "-1"; 
char buf[99999]; 
int x = libssh2_sftp_read(sftp_handle, buf, sizeof(buf)); 
char * output = (char *)malloc(sizeof(char)*x); 
memcpy(output, buf, x); 
output[x] = '\0'; 
libssh2_sftp_close(sftp_handle); 

************アップデート1 ************

私がしようとしているファイルreadはほぼすべてのascii文字を含むテキストファイルです。アップデート2 ************

xバッファに書かれたバイト数とファイルが持っている

************〜98キロバイト(99999バイト)、libssh2_sftp_read関数は30000からxを返します。

+0

'libssh2_sftp_read'が実際に返すものを確認しましたか?あなたが読もうとしたファイル、それはどのようなファイルですか?その内容は何ですか?埋め込みゼロを含むことができるバイナリファイルですか?バイナリファイルの場合は、テキスト出力( 'cout << output'など)を使わないでください。あなたが受け取るデータの目的は何ですか?どのようにデータを使用するのですか? –

+0

'libssh2_sftp_read'と' memcpy'は '\ 0'で停止しませんので、' x'をチェックしてください。 –

+0

'std :: string'を使い始めると、'(const)char * 'の' operator << 'は' \ 0'で止まります。 –

答えて

1

私はコードがスニペットであると仮定しているので、下のコメントは、ベーススニペットの周りを回転するループがある場合は適切でないかもしれません。

libssh2_sftp_read()は、ファイルのフルバイトを読み取ることはできませんが、1回の呼び出しで読み取ることができる最大値です。したがって、この呼び出しは、ゼロを返すか、読み取りバッファをスキャンしてEOF文字をチェックするまで繰り返す必要があります。 [EOFチェックはあなたのコードのプラットフォームに依存する可能性があります]。下のマニュアルページを強調表示するだけです。

LIBSSH2_SFTP_HANDLEから1ブロックのデータを読み込みます。このメソッドは、POSIXのread(2)関数の後にモデル化された であり、同じ呼び出しを行う セマンティクスを使用します。 libssh2_sftp_readは、できるだけ多くのファイルを読み込もうとしますが、ファイルポインタが に達した場合、またはそれ以上の読み込みでソケットがブロックされた場合、すべてのバッファがいっぱいにならない可能性があります。

+0

問題は 'libssh2_sftp_read()'が30000を返し、出力に224バイトがあることです。 –

+0

@ Samega7Cattacそれは何を意味するのですか? "出力は224バイトです" *?とにかくあなたの質問はどこでこの情報を提供していますか? –

関連する問題