我有这个短代码,它使用libhdfs从Hadoop文件系统(HDFS)上的文本文件中读取字节。它编译并正常工作。我现在正在尝试更改代码,以便我也可以阅读文本文件的内容。
以下是我现在用于从HDFS打印文本文件的代码:
#include "jni.h"
#include "hdfs.h"
#include "string.h"
#include "stdlib.h"
int
main(int argc, char **argv)
{
int MAXBUFLEN = 1024;
hdfsFS fs = hdfsConnect("default", 0);
const char* readPath = "/tmp/testfile.txt";
hdfsFile readFile = hdfsOpenFile(fs, readPath, O_RDONLY, 0, 0, 0);
if(!readFile) {
fprintf(stderr, "Failed to open %s for writing!\n", readPath);
exit(-1);
}
char buffer[MAXBUFLEN+1];
int bytes = hdfsRead(fs, readFile, buffer, strlen(buffer));
buffer[MAXBUFLEN] = '\0';
hdfsCloseFile(fs, readFile);
return 0;
}
答案 0 :(得分:1)
您应该以这种方式初始化缓冲区:
char buffer[MAXBUFLEN+1] = {};
然后将最大缓冲区长度(不要使用strlen
)传递给读取函数:
int bytes = hdfsRead(fs, readFile, buffer, MAXBUFLEN);
不需要这一行:
buffer[MAXBUFLEN] = '\0';
因为缓冲区已正确初始化。然后,您可以将整个缓冲区输出为c字符串:
std::cout << buffer << std::endl;
字符串长度现在应该等于读取字节:
assert(strlen(buffer)==bytes);