2012-02-25 3 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を参照してください - buffer = malloc(fileStats.st_size);
  3. 読むすなわちサイズ
  4. mallocバッファを取得しますファイルfread(buffer, fileStats.st_size, 1);
  5. ファイルを閉じます。
  6. あなたの心のコンテンツにバッファーで遊んでください。

null文字を入れるには、バッファサイズに1を追加するとよいでしょう。

+0

受け入れ可能な典型的なHTMLページ。しかし、そのような大きなデータダンプを処理すると、メモリを無駄にしてしまいます。 OPリクエストは、これらのうちの1つです。これは、バッファブロックで簡単に実装できます。 – datenwolf

+0

質問は、テキストファイル**のすべてを読むことに問題があります(と私は引用します)**問題です。個人的には、読まれるサイズに上限を設けます。 –

+0

すべてのテキストファイルを読むことは、テキストファイル全体がある時点でプログラムメモリに存在することを意味するものではありません。これは本を読んだようなものです。たとえ読んだ本をすべてページごとに読んだとしても、最終的にはすべてを処理してしまいます。 – datenwolf

3

の代わりに単一のバッファ内のすべてのテキストを収集し、あなただけのループに上記を入れて、バッファを満たすために繰り返しread()を呼び出すことができます。あなたがそれを読むときに各チャンクを処理し、それまでに処理した部分をプリントアウトします。ファイルの終わりに達すると(つまり、read()が0を返したとき)、停止します。

2

より効率的な)(MMAPを使用したメモリに直接ファイルをマッピングするために呼び出すために、次のようになります。ファイルが2GBその後、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)です。

関連する問題