2

現在、生データ (jpg など) の Burrows-Wheeler 変換 (および逆変換) を実装しています。テキストファイルなどの通常のデータでテストする場合、問題は発生しません。しかし、jpg ファイルの読み取りに関しては、たとえば、文字 0x1a 別名代替文字で読み取りを停止します。OSに依存するコードを使用しないが結果がないソリューションをインターネットで検索してきました...バイナリモードで標準入力を読み込もうと思っていましたが、それは簡単ではないと思います。この問題を解決する簡単な方法はありますか?

コード:

buffer = (unsigned char*) calloc(block_size+1,sizeof(unsigned char));
length = fread((unsigned char*) buffer, 1, block_size, stdin);
if(length == 0){
    // file is empty
}else{
    b_length = length;
    while(length == b_length){
        buffer[block_size] = '\0';
        encodeBlock(buffer,length);
        length = fread((unsigned char*) buffer, 1, block_size, stdin);      
    }
    if(length != 0){            
        buffer[length] = '\0';
        encodeBlock(buffer,length);
    }
}
free(buffer);
4

5 に答える 5

5

お気づきのようにstdin、ASCII モードで読み取りを行っており、SUB 文字 (代替、別名CTRL+ Z、別名 DOS End-of-File) にヒットしています。

setmodeWindows では次のようにモードをバイナリに変更する必要があります。

#if defined(WIN32)
#include <io.h>
#include <fcntl.h>
#endif /* defined(WIN32) */

/* ... */

#if defined(WIN32)
_setmode(_fileno(stdin), _O_BINARY);
#endif /* defined(WIN32) */

Windows 以外のプラットフォームでは、モードでこの違いに出くわすことはありません。

于 2012-10-17T20:26:10.823 に答える
3

OS に依存しないと、これを行うことはできません。C 言語の仕様には (7.19.3) と記載されています。

プログラムの起動時に、3 つのテキスト ストリームが事前定義されています...

stdinテキストストリームです。OS によっては、既存のストリームのモードを変更したり、低レベルのストリーム データにアクセスしたりする方法があるかもしれませんが、OS 固有のコードは必要ないと主張しています。

于 2012-10-17T20:25:55.277 に答える
2

_setmodestdin をバイナリモードに変換するために使用できます。

もありますfreopen--この SO の質問を参照してください

于 2012-10-17T20:25:07.813 に答える
1

ファイルはバイナリ ファイルとして開く必要があります。

に似たものを使用してください

fopen("file", "rb");
于 2012-10-17T20:10:08.537 に答える
1

read()データを読み込むために使用します。
からデータを取得することに関心があるためstdin

fd = fcntl(STDIN_FILENO, F_DUPFD, 0);

の を取得しfdますstdin

詳細はこちら

この問題は、Windows がakaを として扱う0x1aCTRL+ZEOFという事実と関係があります。Earlz が指摘したように、バイナリ モードで開くと、Windows でこれが修正され、Linux でも機能します。

于 2012-10-17T20:16:46.460 に答える