2016-12-12 2 views
-3

これは私の最初のapprouchで、fread()fwrite()の機能です。だから私は彼らに対処する方法を学んでいます。テキストファイルの場合、私はaを読み込んで別の関数でファイルを作成することに成功しました。しかし、テキスト以外のファイルで試してみると、破損して出力されるだけです。私はインターネット上でこの問題を検索するのに成功した結果がないので、ここで尋ねています。非テキストファイルを正しくfread()およびfwrite()するには?

要約:サーバで開いたファイルからクライアントにデータ収集を送信していて、クライアントがデータを解析して正確なファイルを作成しようとしています。

だから、私は、このやっている方法を説明してみましょう:

FILE* myfile = fopen(fullPath.c_str(), "rb"); 

は、その後、私は、ファイルを読み返すためにループを作成します: を私はバイナリモードでの非テキストファイルを開く(I「が何らかの理由今、私は(私は破損の問題は、バッファのコンバージョンであるかどうかわからないのですsucessfulyクライアントで文字列を解析しています

int readPos = 0; 
std::string externalBuffer; 

while (true) { 
    unsigned char buffer[1024]; 
    int bytesRead = 0; 

    bytesRead += fread(buffer, sizeof(unsigned char), 1024, upfile);  

    if (bytesRead == 0) 
     break; 

    externalBuffer = unsigned_char_to_string(buffer, bytesRead); //This simple function loops over the buff and converts each entry to the string -> the results are numbers from 0-255 

//Here I convert the buffer to a string and send it to the client to be parsed and add to a string buffer like: dataChunk += parsedString; 

//clear buffers 

} 

)非テキストファイルの実際のサイズがsize/4に等しいことが判明しまし文字列に)。 ループからのすべてのデータが送信された後。クライアントは、バッファdataChunkを使用して、その後の書き込みをしようとします:

FILE* myfile = fopen(fullPath.c_str(), "wb+"); 
fwrite(dataChunk.c_str(), sizeof(char), dataChunk.size(), myfile); 
fclose(myfile); 

私はすでにその16進数に0〜255の各エントリを変換して、新しいファイルへの書き込み、16進文字列に送信されたデータを変換しようとしました。また、dataChunk文字列をunsigned char配列に変換しようとしました。しかし、すべての私の試みは、破損したファイルにつながった。私は、このメソッドを使用して、実行可能ファイルとpngイメージを作成しようとしました。 私はまた、fopenのいくつかの例を見て、すべてのファイルを一度にコピーしてから、fwriteを同じ関数で新しい関数で作成しました。

このコードでは何が問題なのですか、完璧なファイルが出力されないのはなぜですか? fread()fwrite()を間違って使用していますか?

+0

「彼らは単に破損している」とはどういう意味ですか? – immibis

+1

なぜC++のクラスではなく、C++プログラムで 'stdio'関数を使用していますか? – Barmar

+0

@immibisファイルは実行されません。それはサイズを持っていません。私はそうだと思います。 – Xabirau

答えて

0

@Barmar補正あり。私は、このコードにunsigned_char_to_string機能変更 :

std::string externalBuffer(&buffer[0], &buffer[0] + bytesRead); 

を、それが完全に働きました!

ありがとう@Barmar!あなたは私の一日を作った!

関連する問題