2017-12-31 180 views
1

この短いコードは、Hadoopファイルシステム(HDFS)のテキストファイルからlibhdfsを使用してバイトを読み取ります。コンパイルして正常に動作します。私は今テキストファイルの内容を読むことができるようにコードを変更しようとしています。 (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で作成したローカル・シングル・ノードのクラスタ・ファイルを読み込み、ファイルを読み書きするだけで、それをグーグルで練習しています。:) – ArifMustafa

+0

@ArifMustafa回答。私は遠隔からファイルにアクセスしているわけではないことも承知しています。私はちょうど同じHadoop環境(Hortonworks Sandbox)でローカルにHDFSのトラフC++にあるファイルにアクセスして読みたいと思っています。 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/LibHdfs.htmlのサンプルプログラムを見てみると、ローカルにHDFSに書き込む例が表示されます。私はまったく同じことをしたいが、その代わりに読んで印刷する。 –

+0

あなたがハープのクラスタにアクセスしていることを意味するわけではなく、あなたはまだローカル環境にいます。あなたはそのようなウィンドウ、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]に直接変更しなければなりませんでした:可変サイズのオブジェクトのバッファ'初期化されていない可能性があります。 –

関連する問題