2012-02-25 139 views
0

下面是我的代码的一部分,用于从文本文件中读取数据,去除HTML并打印出正常文本。这一切工作膨胀,但我在阅读所有的文本文件有问题。我如何阅读整个文本文件,明白我可能需要使用malloc,但我不确定如何操作。动态char缓冲区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,跟踪您读取的数量并将其附加到缓冲区;缓冲区需要根据需要增长,大概是通过'realloc'。 – 2012-02-25 14:05:08

回答

2

如果你想阅读完整的文件执行以下操作:

  1. 打开文件
  2. 使用fstat - 见fstat - 让大小
  3. malloc缓冲区即buffer = malloc(fileStats.st_size);
  4. 阅读文件fread(buffer, fileStats.st_size, 1);
  5. 关闭文件。
  6. 玩你的心中的缓冲区内容。

您可能希望添加一个缓冲区大小以将空字符放入其中。

+0

对于可接受的典型HTML页面。但是如果你要处理大量的数据转储,你只是在浪费内存。 OP请求是少数几个中的一个,可以在缓冲块上实现。 – datenwolf 2012-02-25 14:37:04

+0

该问题询问(和我引用)**阅读所有文本文件**的问题。就我个人而言,我会提出一个读取大小的上限。 – 2012-02-25 14:41:10

+0

读取所有文本文件并不意味着整个文本文件在程序存储器中出现。这就像读一本书:即使你阅读一本书的所有内容,但是最终你会完成所有的工作。 – datenwolf 2012-02-25 14:59:38

3

而是收集在一个缓冲区中的所有文本,你可以只是把上面的循环,并呼吁read()反复填充缓冲区。在读取它时处理每个块,并打印出到目前为止处理过的部分。当你点击文件结束时(即当read()返回0时)停止。

2

更有效的将是使用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); 

如果文件大于2GB然后使用mmap2()调用 - 你将不得不拨弄页面大小作为页面中的最后一个参数(通常为4k)