【发布时间】:2017-07-09 16:45:26
【问题描述】:
我正在使用 libssh2 lib 与设备进行 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************
我要读取的文件是一个包含几乎所有 ascii 字符的文本文件。
************更新2************
x 是写入缓冲区的字节数,文件有 ~98kb(99999 字节),但 libssh2_sftp_read 函数返回 30000 到 x。
【问题讨论】:
-
您检查过
libssh2_sftp_read实际返回的内容吗?您尝试读取的文件是什么类型的文件?它的内容是什么?它是可以包含嵌入零的二进制文件吗?如果它是二进制文件,则不要使用文本输出(如cout << output等)。您收到的数据的目的是什么?你应该如何使用这些数据? -
libssh2_sftp_read和memcpy都不会停在\0,你应该检查x。 -
开始使用
std::string并将其打印出来,operator<<for(const) char*将在\0停止。 -
@Someprogrammerdude 我更新以添加文件的一些信息。
libssh2_sftp_read将返回他写入缓冲区的字节数。cout我忘记删除了! xD -
@RickAstley Yap,文件有 ~98kb,但 x 为 30000。但输出比这小得多