2012-01-06 17 views
2

ファイルのすべてのビットを反転する簡単なプログラムを書いていますが、今は最初の1000バイトしか処理しません。 read()の呼び出しが\ r文字を無視するのはなぜですか? \ r \ n \ r \ nのみを含むファイルでこのコードを実行すると、読み込み呼び出しは2を返し、バッファには\ n \ nが含まれます。 \ r文字は完全に無視されます。私はこれをWindows上で実行しています(これはLinuxマシンでも問題ではありません)read(2)はキャリッジリターンとどのように対話しますか?

なぜ、それが見つかるとread(2)はスキップされますか?それとも何が起こっているのですか?

EDIT:結論として、ウィンドウはデフォルトで「バイナリ」モードではなく「テキスト」モードでファイルを開くことになります。このため、openを呼び出すときは、O_BINARYをモードとして指定する必要があります。

ありがとう、以下のコード。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void invertBytes(size_t amount, char* buffer); 

int main(int argv, char** argc) 
{ 
    int fileCount = 1; 
    char* fileName; 
    int fd = 0; 
    size_t bufSize = 1000; 
    size_t amountRead = 0; 
    char* text; 
    int offset = 0; 

    if(argv <= 1) 
    { 
     printf("Usages: encode [filenames...]\n"); 
     return 0; 
    } 

    text = (char *)malloc(sizeof(char) * bufSize); 

    for(fileCount = 1; fileCount < argv; fileCount++) 
    { 
     fileName = argc[fileCount]; 
     fd = open(fileName, O_RDWR); 
     printf("fd: %d\n", fd); 
     amountRead = read(fd, (void *)text, bufSize); 
     printf("Amount read: %d\n", amountRead); 
     invertBytes(amountRead, text); 
     offset = (int)lseek(fd, 0, SEEK_SET); 
     printf("Lseek to %d\n", offset); 
     offset = write(fd, text, amountRead); 
     printf("write returned %d\n", offset); 
     close(fd); 
    } 

    return 0; 
} 

void invertBytes(size_t amount, char* buffer) 
{ 
    int byteCount = 0; 
    printf("amount: %d\n", amount); 
    for(byteCount = 0; byteCount < amount; byteCount++) 
    { 
     printf("%x, ", buffer[byteCount]); 
     buffer[byteCount] = ~buffer[byteCount]; 
     printf("%x\r\n", buffer[byteCount]); 
    } 
    printf("byteCount: %d\n", byteCount); 
} 
+0

どのような環境を使用していますか? 'open'と' read'はウィンドウ固有のものではありません。 –

+0

これは今すべてWindows XP上で行われます。私はコマンドラインからそれをコンパイルします。 – Akron

+2

はい、どちらの_development_環境を使用していますか? –

答えて

4
fd = open(fileName, O_RDWR); 

fd = open(fileName, O_RDWR | O_BINARY); 

でなければなりません詳細についてはread() only reads a few bytes from fileを参照してください。

+0

うわー、あなたは正しいです。私はその1行を変更し、\ r文字を正しく処理しています。これをLinuxマシンでコンパイルした場合、O_BINARYモードを指定する必要がありますか?私はunixファイルには通常\ rが含まれていないことを知っています。 – Akron

+1

バイナリファイルには常にO_BINARYを使用します。これはちょうど丁寧なやり方で、cygwinでクロスコンパイルするための移植性を促進します。 –

+1

いいえ、Linuxではバイナリモードとテキスト(?)モードに違いはありません。もちろん、移植性のためには、とにかくO_BINARYを使う方が良いでしょう。 –

2

バイナリモードを使用するにはO_BINARYを使用してオープンしてください。テキストモードはデフォルトであり、\ rを無視することがあります。

open(fileName、O_RDWR | O_BINARY);

関連する問題