2017-08-08 3 views
1

unistdライブラリを使用してテキストファイルの書き込み/読み取りを試みています。私は後でそれを/ devパスのファイルに展開します。 char buffer[]の代わりにstd::vectorタイプを使用しようとしています。だから、私は二つの実装を書いた。一つはベクトルともう一つのcharバッファを使っている。どちらもファイルにうまく書き込まれますが、どちらもファイルを読み取ることはできません。ベクトルunistd read()が機能しません

void tests_using_buffer_of_vector(const std::string &path) 
{ 
    int file_descriptor_vector; 
    std::vector<char> buffer = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    std::cout << buffer.size() << std::endl; 

    for(auto i : buffer) 
     std::cout << i << std::endl; 

    file_descriptor_vector = open(path.c_str(), O_RDWR); 
    if(file_descriptor_vector != -1) 
     std::cout << "open whit success " << path << std::endl; 

    ssize_t write_bytes = write(file_descriptor_vector, buffer.data(), buffer.size()); 
    std::cout << buffer.size() << " <-- size of buffer " << write_bytes << " <-- size of writed bytes" << std::endl; 

    buffer.clear();  

    ssize_t read_bytes = read(file_descriptor_vector, buffer.data(), write_bytes); 
    std::cout << buffer.size() << " <-- size of buffer " << read_bytes << " <-- size of readed bytes" << std::endl;  

    for(auto i : buffer) 
     std::cout << i << std::endl; 

    if(close(file_descriptor_vector) != -1) 
     std::cout << "close with success " << path << std::endl; 

} 

おかげでみんなをバッファを使用して文字

void tests_using_buffer_of_char(const std::string &path) 
{ 
    int file_descriptor_char; 
    char buffer[8] ={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    std::cout << sizeof(buffer) << std::endl;  

    for(auto i = 0; i < sizeof(buffer); i++) 
     std::cout << buffer[i] << std::endl; 

    file_descriptor_char = open(path.c_str(), O_RDWR); 
    if(file_descriptor_char != -1) 
     std::cout << "open with success " << path << std::endl; 

    std::size_t size = strlen(buffer); 
    ssize_t write_bytes = write(file_descriptor_char, buffer, size); 
    std::cout << size << " <-- size of buffer " << write_bytes << " <-- size of writed bytes" << std::endl; 

    memset(&buffer[0], 0, sizeof(buffer)); 

    ssize_t read_bytes = read(file_descriptor_char, &buffer, size); 
    std::cout << size << " <-- size of buffer " << read_bytes << " <-- size of readed bytes" << std::endl; 

    for(auto i = 0; i < sizeof(buffer); i++) 
     std::cout << buffer[i] << std::endl; 

    if(close(file_descriptor_char) != -1) 
     std::cout << "close with success "<< path << std::endl; 
} 

使用してバッファ:

は、ここに私のテストコードです!

+1

'unistd'はライブラリではなく、POSIXシステムのCヘッダです。 * xy *が標準関数であることを知っているときには、* xy *が動作しないと書いてはいけません。何百万人ものプログラマーのために働いています。 –

+0

あなたは正しいです!アドバイスありがとう。次の質問では、私は問題についてより正確で一般的ではないでしょう。 – gorn

答えて

1

1] fcloseを使用してファイルを再オープンしてください。

2] fseek(fp, 0, SEEK_SET);

3] rewind(fp);

あなたはfile pointerと、ファイルの末尾を指しています。

1

書き込みのためにファイル記述子を使用した後に、ファイル記述子をファイルの先頭に再設定してから読み込みを再試行する必要があります。あなたはファイルを閉じてそれを再び開くことができます。そうしないと、最初に探せます。

lseek(file_descriptor_vector, SEEK_SET, 0); 

ベクトルを読み取る前にクリアしないでください。 clearメソッドは、基本的にベクトルに関連付けられたメモリの割り当てを解除します。

+0

ありがとう!これは私のために働く。 – gorn

-1

私は専門家ではありませんが、私はまだ自分自身をC/C++の初心者だと考えていますが、お手伝いしたいと思います。 それが本当であるかどうかわかりませんが、ファイルから読み込みを開始する前に書き込みバッファを閉じてはいけませんか? 私は最初、あなたはプロセスが書き込みをしようとしていると思います。ファイルがまだ書き込まれている間は、そのファイルを読み込もうとします。ファイルの書き込み段階でコードがまだ使用されているため、読み込めません。 原則として。 ファイルディスクリプタ/バッファを読み書きした後、またはファイルディスクリプタ/バッファをクローズまたはリセットした後。

+0

厳しいものではありません。私はあなたの貢献と貢献に感謝しますが、わからない場合は答えを書かないでください。それは(他のものの中でも)コメントのためのものです。あなたが*ポイント*に答えることができる質問に答えると、*とても*すばやくコメントするのに十分な担当者がいます。 –

+0

申し訳ありませんが、次回はもっと慎重になります。 –

+0

あなたはあなたがあなたの考えを使ってあなたの事実をオンラインで確認し、あなた自身でそれを証明してから、それを提出することができます。あなたの恥ずかしさを救い、expierenceを学ぶことになります – Swift

関連する問題