read(2)如何与回车相互作用?

时间:2012-01-06 20:27:56

标签: c windows file io

我正在编写一个简单的程序来翻转文件中的所有位,但是现在它只执行前1000个字节,直到我得到那么多工作。为什么我对read()的调用会忽略\ r \ n字符?当我在仅包含\ r \ n \ r \ n的文件上运行此代码时,读取调用返回2并且缓冲区包含\ n \ n。 \ r \ n字符完全被忽略。我在Windows上运行它(这在Linux机器上甚至不是问题)

为什么read(2)在找到它时跳过\ r字符?或者这是发生了什么?

编辑:结论是Windows默认以“文本”模式打开文件而不是“二进制”模式。因此,在调用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);
}

2 个答案:

答案 0 :(得分:4)

fd = open(fileName, O_RDWR);

应该是

fd = open(fileName, O_RDWR | O_BINARY);

有关详细信息,请参阅read() only reads a few bytes from file

答案 1 :(得分:2)

尝试使用O_BINARY打开以使用二进制模式,文本模式可能是默认值,可能会忽略\ r。

open(fileName,O_RDWR | O_BINARY);