Динамический буфер символов C - PullRequest
0 голосов
/ 25 февраля 2012

Ниже приведена часть моего кода для чтения данных из текстового файла, вырезания HTML-кода и распечатки только обычного текста. Все это прекрасно работает, но у меня проблема с чтением всего текстового файла. Как бы я прочитал весь текстовый файл, понял, что мне, вероятно, понадобится использовать malloc, но я не уверен, как это сделать.

int i, nRead, fd;
int source;
char buf[1024];
int idx = 0;
int opened = 0;

if((fd = open("data.txt", O_RDONLY)) == -1)
{
    printf("Cannot open the file");
}
else
{
    nRead = read(fd, buf, 1024);
    printf("Original String ");
    for(i=0; i<nRead; i++)
    {
        printf("%c", buf[i]);
    }

    printf("\nReplaced String ");

    for(i=0; i<nRead; i++)
    {
        if(buf[i]=='<') {
            opened = 1;
        } else if (buf[i] == '>') {
            opened = 0;
        } else if (!opened) {
            buf[idx++] = buf[i];
        }           
        //printf("%c", buf[i]);
    }
}
    buf[idx] = '\0';
    printf("%s\n", buf);
close(source);

Ответы [ 3 ]

3 голосов
/ 25 февраля 2012

Если вы хотите прочитать полный файл, сделайте следующее:

  1. Откройте файл
  2. Используйте fstat - см. fstat - чтобы получитьразмер
  3. malloc буфер, т.е. buffer = malloc(fileStats.st_size);
  4. Считать файл fread(buffer, fileStats.st_size, 1);
  5. Закрыть файл.
  6. Поиграйте с буфером в контент вашего сердца.

Вы можете добавить единицу к размеру буфера, чтобы поместить в него нулевой символ.

3 голосов
/ 25 февраля 2012

Вместо того, чтобы собирать весь текст в одном буфере, вы можете просто поместить вышеприведенное в цикл и повторно вызывать read() для заполнения буфера. Обрабатывайте каждый блок как вы читаете, и распечатайте часть, которую вы обработали до сих пор. Когда вы нажмете конец файла (то есть, когда read() вернет 0,) остановитесь.

2 голосов
/ 26 февраля 2012

Более эффективным будет использование вызова mmap () для сопоставления файла непосредственно в память:

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat statbuf;
stat("data.txt", &statbuf);

size_t len = stat.st_size;

int fd = open("data.txt",O_RDONLY);

char *buf = mmap(NULL, len, PROT_READ, MAP_PRIVATE,fd, 0);
for( i=0; i< len; i++ ) {
   // do your own thing here
}
munmap(buf,len);
close(fd);

Если размер файла превышает 2 ГБ, используйте вызов mmap2 () - вам придется возиться с размерами страниц, так как последний аргумент указывается в страницах (обычно 4 КБ)

...