2012-02-25 5 views
0

다음은 텍스트 파일에서 데이터를 읽고 HTML을 제거하고 일반 텍스트 만 인쇄하는 코드입니다. 이 모든 일이 팽창하지만 텍스트 파일을 모두 읽는 데 문제가 있습니다. 어떻게하면 전체 텍스트 파일을 읽을 것인가? 아마 malloc을 사용할 필요가있을 것이지만 그렇게하는 방법을 모르겠다. 대신 단일 버퍼의 모든 텍스트를 수집동적 문자 버퍼 C

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); 
+1

'0'이 될 때까지'read' 호출을 반복하고, 읽은 양을 추적하여 버퍼에 추가해야합니다. 아마도'realloc '을 통해 버퍼가 필요에 따라 커질 필요가있다. –

답변

2

다음을 수행하십시오

  1. 파일을 엽니 다
  2. 사용 fstat-fstat 참조 - 크기
  3. malloc 버퍼 즉 buffer = malloc(fileStats.st_size);
  4. 읽기를 얻을 수 파일 fread(buffer, fileStats.st_size, 1);
  5. 파일을 닫습니다.
  6. 마음 속의 콘텐츠를 버퍼로 재생하십시오.

null 문자를 삽입하려면 버퍼 크기에 하나를 추가 할 수 있습니다.

+0

수용 가능한 일반적인 HTML 페이지. 하지만 대형 데이터 덤프를 처리한다면 메모리를 낭비하는 것일뿐입니다. OP 요청은 그 중 일부이며 버퍼 블록에서 쉽게 구현할 수 있습니다. – datenwolf

+0

질문은 모든 텍스트 파일 **을 읽는 데 문제가 있습니다. 개인적으로 나는 읽을 수있는 크기의 상한을 둡니다. –

+0

모든 텍스트 파일을 읽는 것은 전체 텍스트 파일이 어느 시점에서 프로그램 메모리에 존재 함을 의미하지 않습니다. 이것은 책을 읽는 것과 같습니다. 책 한 권을 페이지별로 읽지 만 결국 결국 모두 처리하게됩니다. – datenwolf

3

, 당신은 단지 루프에서 위 넣어 버퍼를 채우기 위해 반복 read()를 호출 할 수 있습니다. 각 청크를 읽으면서 처리하고 지금까지 처리 한 부분을 인쇄하십시오. 파일 끝 (EOF)을 치면 (즉, read()이 0을 반환하는 경우) 중지합니다. 당신이 전체 파일을 읽으려면

2

보다 효율적인)합니다 (mmap에를 사용하여 메모리에 파일을 직접지도하기 위해 호출하는 것입니다 : 파일이 2 기가 바이트 다음 mmap2() 호출을 사용하여보다 긴

#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); 

경우 - 당신이 바이올린해야합니다 페이지 크기는 마지막 인자가 페이지 수 (일반적으로 4k)입니다.