прочитать 300 МБ текстового файла в C - PullRequest
0 голосов
/ 05 февраля 2012

Как лучше всего читать текстовый файл (максимальный размер: 300 МБ) в C?Я хочу найти конкретный шаблон в текстовом файле.Кроме того, я должен получить доступ ко всем текстовым символам.

Ответы [ 3 ]

4 голосов
/ 05 февраля 2012

Я бы предложил mmap файл в пространство процесса и обработать файл как текстовую строку. Это позволит вам избежать каких-либо сложностей с распределением памяти malloc, fread и т. Д., А ОС будет обрабатывать любые входные / выходные данные по мере необходимости.

В руководстве приведен пример кода - основные сведения приведены ниже ...

 int fd;
 struct stat sb;
 int filesize;
 char *filetext;
 fd = open("/path/to/my/300mb/file", O_RDONLY);
 if (fd == -1)
     handle_error("open");

 if (fstat(fd, &sb) == -1) /* To obtain file size */
     handle_error("fstat");
 filesize = sb.st_size;

 filetext = mmap(NULL, filesize, PROT_READ,MAP_PRIVATE, fd, 0);
 if (filetext == MAP_FAILED)
     handle_error("mmap");

  /* you now have the file mapped into memory with
     filetext[0] as the first byte and
     filetext[filesize-1] as the last byte
   */

  /* use the file content as a char* text string.... */
  while (....) do what ever needed

  /* release the file when done */
  munmap(filetext,filesize); 
  close(fd);
3 голосов
/ 05 февраля 2012

Если у вас относительно неограниченная память (>> 300 МБ), прочитайте весь файл в память с помощью fread () и используйте библиотеку GNU regex (http://www.gnu.org/software/libc/manual/html_node/Regular-Expressions.html).

0 голосов
/ 05 февраля 2012

Я бы предложил использовать fread()

fread(), который дает вам столько же контроля, сколько fgetc(), и имеет преимущество, заключающееся в возможности чтения более одного символа за одну операцию ввода-вывода.На самом деле, если позволяет память, вы можете прочитать весь файл в массив и выполнить всю вашу обработку в памяти.Это имеет значительные преимущества в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...