2017-12-31 177 views
1

을 사용하여 HDFS (Hadoop File System)의 텍스트 파일에서 바이트를 읽는 짧은 코드가 있습니다. 그것을 컴파일하고 잘 작동합니다. 텍스트 파일의 내용을 읽을 수 있도록 코드를 변경하려고합니다. (HDFS에서 텍스트 파일 읽기 및 인쇄

char buffer[MAXBUFLEN+1] = {}; 

후 최대 버퍼 길이를 통과 : 당신은 당신의 버퍼 이런 식으로 초기화한다

#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

쓰기 솔직히, 여기에 원격으로 파일에 액세스하지 않지만 장소 상에서. 당신은 하드 디스크에 hadoop을 통해 생성 된 로컬 단일 노드 클러스터 파일을 읽고 있습니다. 파일을 읽고 쓰려면 간단히 google을 사용하고 연습을 해보십시오. :) – ArifMustafa

+0

@ArifMustafa는 대답. 내가 파일에 원격으로 액세스하지 않는다는 것을 알고 있는데, 이는 의도도 아닙니다. 난 단지 같은 Hadoop 환경 (Hortonworks Sandbox) 내 HDFS 물마루 C++에있는 파일을 읽고 액세스하려고합니다. https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/LibHdfs.html에서 샘플 프로그램을 살펴보면 로컬로 HDFS에 쓰는 예제를 볼 수 있습니다. 나는 똑같은 것을하고 싶지만 그 대신에 읽고 인쇄하고 싶다. –

+0

참고로, 가상 호스트에 액세스하고 있다는 것을 의미하지는 않습니다. 로컬 환경에 있거나, Windows, Linux, Macox 등의 호스트에 있거나 가상 호스트 인 vmware wrkstn을 통해 게스트 OS를 사용 중입니다. 플레이어, Hyper-V Bro는 클래스 파일 근처에 텍스트 파일을 놓고 연습 해보고,이 링크 https://www.codesdope.com/cpp-file-io/를 보시고 연습을 해보십시오. 도움이된다면 그것을 표시하고, 감사. – ArifMustafa

답변

1

다음

HDFS에서 텍스트 파일을 인쇄하기 위해 지금 내가 가지고있는 코드입니다

int bytes = hdfsRead(fs, readFile, buffer, MAXBUFLEN); 

번호 : 읽기 기능) strlen를 사용하지 않는 이 줄의 필요성 : 버퍼가 제대로 초기화되었으므로

buffer[MAXBUFLEN] = '\0'; 

이 필요합니다. 그런 다음 출력은 교류 문자열로 전체 버퍼 수 있습니다

std::cout << buffer << std::endl; 

문자열의 길이는, 지금, 읽기 바이트 같아야한다 :

assert(strlen(buffer)==bytes); 
+0

이것은 내가 원했던 것처럼 완벽하고 테스트를 거쳤습니다. 이제 로컬 HDFS에서 C++로 텍스트 파일을 인쇄 할 수 있습니다. int MAXBUFLEN = 1024이고 char 버퍼 [MAXBUFLEN + 1] = {}이 (C++/g ++)로 컴파일 할 때 오류를주는 것처럼 [MAXBUFLEN + 1]을 [1024]로 직접 변경해야했습니다. 가변 크기 객체의 버퍼 '초기화하지 못할 수도 있습니다.' –