Как read (2) взаимодействует с возвратом каретки? - PullRequest
2 голосов
/ 07 января 2012

Я пишу простую программу, которая переворачивает все биты в файле, но сейчас она делает только первые 1000 байтов, пока я не получу столько работы.Почему мой вызов read () игнорирует символы \ r?Когда я запускаю этот код для файла, который содержит только \ r \ n \ r \ n, вызов read возвращает 2, а буфер содержит \ n \ n.Символы \ r полностью игнорируются.Я запускаю это в Windows (это даже не будет проблемой на машинах Linux)

Почему read (2) пропускает символ \ r, когда находит его?Или это то, что происходит?

РЕДАКТИРОВАТЬ: Вывод: окна по умолчанию открывают файлы в «текстовом» режиме, а не в «двоичном» режиме.По этой причине при вызове 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 ]

4 голосов
/ 07 января 2012
fd = open(fileName, O_RDWR);

должно быть

fd = open(fileName, O_RDWR | O_BINARY);

См. read () читает только несколько байтов из файла для подробностей.

2 голосов
/ 07 января 2012

Попробуйте открыть с помощью O_BINARY, чтобы использовать двоичный режим, текстовый режим может быть по умолчанию и может игнорировать \ r.

открыть (имя файла, O_RDWR | O_BINARY);

...