C++ libssh2-使用SFTP读取文件
我正在使用libssh2lib与设备进行SFTP会话 但是当我试图读取文件并返回输出时,永远不要返回完整的文件 我认为是因为控制字符(如<代码> 0代码>代码>)在文件的中间。 代码: ************更新1************ 我试图读取的文件是一个包含几乎所有ascii字符的文本文件 ************更新2************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我假设代码只是一个
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);