Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libssh2-使用SFTP读取文件_C++_String_Sftp_Libssh2 - Fatal编程技术网

C++ libssh2-使用SFTP读取文件

C++ libssh2-使用SFTP读取文件,c++,string,sftp,libssh2,C++,String,Sftp,Libssh2,我正在使用libssh2lib与设备进行SFTP会话 但是当我试图读取文件并返回输出时,永远不要返回完整的文件 我认为是因为控制字符(如 0代码>代码>)在文件的中间。 代码: ************更新1************ 我试图读取的文件是一个包含几乎所有ascii字符的文本文件 ************更新2************ x是写入缓冲区的字节数,文件大小约为98kb(99999字节),但是libssh2\u sftp\u read函数返回30000到x我假设代码只是一个

我正在使用libssh2lib与设备进行SFTP会话

但是当我试图读取文件并返回输出时,永远不要返回完整的文件

我认为是因为控制字符(如<代码> 0代码>代码>)在文件的中间。

代码:

************更新1************

我试图读取的文件是一个包含几乎所有ascii字符的文本文件

************更新2************


x
是写入缓冲区的字节数,文件大小约为98kb(99999字节),但是
libssh2\u sftp\u read
函数返回30000到
x

我假设代码只是一个片段,因此如果有一个围绕基本片段的循环,下面的注释可能不合适

libssh2\u sftp\u read()
可能无法读取文件的完整字节,但它可以在一次调用中读取的最大字节数。因此,可能需要重复此调用,直到它返回零或扫描读取缓冲区以检查EOF字符。[EOF检查可能使平台依赖于您的代码]。只需突出显示下面的手册页

从LIBSSH2_SFTP_句柄读取数据块。这种方法是可行的 根据POSIX read(2)函数建模,并使用相同的调用 语义学。libssh2_sftp_read将尝试尽可能多地读取 但是,如果文件指针到达缓冲区,它可能不会填充所有缓冲区 结束或如果进一步读取会导致套接字阻塞


我假设代码只是一个片段,因此如果存在围绕基本片段的循环,下面的注释可能不合适

libssh2\u sftp\u read()
可能无法读取文件的完整字节,但它可以在一次调用中读取的最大字节数。因此,可能需要重复此调用,直到它返回零或扫描读取缓冲区以检查EOF字符。[EOF检查可能使平台依赖于您的代码]。只需突出显示下面的手册页

从LIBSSH2_SFTP_句柄读取数据块。这种方法是可行的 根据POSIX read(2)函数建模,并使用相同的调用 语义学。libssh2_sftp_read将尝试尽可能多地读取 但是,如果文件指针到达缓冲区,它可能不会填充所有缓冲区 结束或如果进一步读取会导致套接字阻塞


您是否检查了libssh2\u sftp\u read实际返回的内容?您试图读取的文件是什么类型的文件?它的内容是什么?它是可以包含嵌入零的二进制文件吗?如果是二进制文件,则不要使用文本输出(就像
既不能
libssh2\u sftp\u读取
也不能
memcpy
停在
\0
,你应该检查
x
。开始使用
std::string
并打印出来,
operator@Someprogrammerdude我已更新以添加文件的一些信息。
libssh2\u sftp\u read
将返回他写入文件的字节数缓冲区。
cout
我忘了删除它!xD@RickAstley是的,这个文件有98kb,但是x是30000。但是输出比这个小得多。你检查了
libssh2\u sftp\u read
实际返回的是什么吗?你试图读取的文件,它是什么类型的文件?它的内容是什么?它是一个可以包含嵌入的二进制文件吗d零?如果是二进制文件,则不要使用文本输出(就像
既不能
libssh2\u sftp\u读取
也不能
memcpy
停在
\0
,你应该检查
x
。开始使用
std::string
并打印出来,
operator@Someprogrammerdude我已更新以添加文件的一些信息。
libssh2\u sftp\u read
将返回他写入文件的字节数缓冲区。
cout
我忘了删除它!xD@RickAstley是的,文件有~98kb,但x是30000。但是输出比这个小得多。一个问题是
libssh2\u sftp\u read()
返回30000,输出有224字节。@Samega7Cattac“输出有224字节”是什么意思?您的问题在哪里提供了这些信息?一个问题是
libssh2\u sftp\u read()
返回30000,输出有224字节。@Samega7Cattac“输出有224字节”是什么意思?您的问题在哪里提供了这些信息?
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);