2016-05-27 1 views
-1

基本的には、fread()を使ってファイルのバイナリデータを読み込み、printf()を使って画面に出力しようとしていますが、実際にはバイナリ1と0は表示されませんが、シンボルや文字は印刷されていません。ファイルのバイナリデータをコピーする方法

これは、私はそれをやっている方法です:

#include <stdio.h> 
#include <windows.h> 


int main(){ 
    size_t sizeForB, sizeForT; 
    char ForBinary[BUFSIZ], ForText[BUFSIZ]; 

    char RFB []  = "C:\\users\\(Unknown)\\Desktop\\hi.mp4" ;  // Step 1 

    FILE *ReadBFrom = fopen(RFB , "rb"); 

    if(ReadBFrom == NULL){ 
     printf("Following File were Not found: %s", RFB); 
     return -1; 
    } else { 
     printf("Following File were found: %s\n", RFB);        // Step 2 
     while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){      // Step 1 
      printf("%s", ForBinary); 
     } 
     fclose(ReadBFrom); 

    } 

    return 0; 
} 

誰かがバイナリ(0,1)として、ファイルの実際のバイナリデータを読み取るために私を助けることができれば、私は本当に感謝。

+0

「バイナリモード」でファイルを開くと、読んだときに特別な処理を行わずにそのままのデータが得られるということです。出力するとそのまま出力され、ガベージのように見えます。 0と1として出力したい場合、それを行うためのコードを書く必要があります。 – kfsone

+2

@Wajid正しくバイナリとして読んでいます。問題は、C/C++ではバイナリプリミティブデータ型がないため、通常は文字(8ビット/文字)として格納されます。このバイナリデータを文字列のように印刷するようにランタイムに指示しているので、シンボルを取得しているのは、印刷しているバイナリデータの文字列表現であるためです。これを見てください:[バイナリを文字列に変換する](/ questions/2343099/convert-binary-format-string-int-in-c) – Tibrogargan

+0

ジョブを正しく実行したい場合は、自分で行う必要があります。 'printf'はバイナリで出力する変換指定子を持っていません。したがって、外側のループがバッファから文字を取得し、内側のループが文字を変換してバイナリとして出力するネストループを作成する必要があります。 – user3386109

答えて

3
while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){    
      printf("%s", ForBinary); } 

これは多くのレベルで間違っています。まず、バイナリファイルであると言いました。つまり、最初にテキストが入っていない可能性があり、ヌル終端文字列の印刷に使用されるフォーマット指定子%sを使用しています。繰り返しますが、これはバイナリファイルであり、最初にテキストが入っていない可能性があります。%sは間違った書式指定子です。このファイルの中にテキストがあっても、freadは、フォーマット指定子%sprintfに渡すことができる "完全な"ヌル終了文字列を読み込むとは確信していません。あなたがやりたいことは何

はバイナリ表現に変換し、ファイルを構成する各バイトを読んで、である(バイナリ文字列に整数に変換する方法グーグルhere、例えば、言う)、及び各そのバイトのバイナリ表現を印刷します。

基本的に疑似コード:

foreach (byte b in FileContents) 
{ 
    string s = convertToBinary(b); 
    println(s); 
} 
1

How to view files in binary in the terminal?

どちらか

"hexdumpが-C yourfile.bin" おそらく、あなたはもちろん、それを編集したい場合を除きます。ほとんどのLinuxディストリビューションはデフォルトでhexdumpを持っています(しかし明らかにすべてではありません)。

又は

時点で1 charを読み取り、単にファイルを読み取り、バイナリ(1とゼロ)でそれを印刷する

1

-bファイルxxdの。各ビットについて、'0'または'1'を印刷します。最上位または最下位ビットを最初に印刷できます。 MSbを提案する。

if (ReadBFrom) { 
    int ch; 
    while ((ch = fgetc(ReadBFrom)) != EOF) { 
    unsigned mask = 1u << (CHAR_BIT - 1); // CHAR_BIT is typically 8 
    while (mask) { 
     putchar(mask & ch ? '1' : '0'); 
     mask >>= 1; 
    } 
    } 
    fclose(ReadBFrom); 
} 
+0

あなたのソリューションは完璧に動作するようですが、1と0で印刷します。バイナリ番号を取得してテキストとしてtxtファイルに入れ、そのファイルからfread()新しいファイルのバイナリデータが動作するようになっています。あなたの助けてくれてありがとう – Wajid

関連する問題