ファイルのすべてのビットを反転する簡単なプログラムを書いていますが、今は最初の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);
}
どのような環境を使用していますか? 'open'と' read'はウィンドウ固有のものではありません。 –
これは今すべてWindows XP上で行われます。私はコマンドラインからそれをコンパイルします。 – Akron
はい、どちらの_development_環境を使用していますか? –