2016-03-29 10 views
-1

私はファイルに書き込むプロセスを1つ持っています。私が作成している新しいプロセスがこのファイルを開き、理想的にはそのファイルの変更を読み込んで処理します。他のプログラムによって絶えず追加されているファイルから読み込む方法C++ linux

これまでのところ、これは私が常に行う別の関数に

後にファイルを開く制御変更をチェックし、それが漠然と

のように見える彼らに

を処理することに読み込むクラスで

open(file); 
while(1) 
{ 
fread(buffer, 1, 16000, file); 
//do something 
} 

問題は、空のファイルをプルして開いた後に書き込むことによってデバッグしています。 FILEオブジェクトには変更のいずれも見られません。

私はeofで終了してもう一度開く必要がありますか?変更を有効にするためにトップ?

+1

あなたはそれから読む前に書き込んだ後、ファイルを閉じる必要があります。 – xinaiz

+1

@BlackMoses:必ずしもそうではありません。これはWindowsではなくLinuxです。 – Olaf

+1

'file.clear()'を使ってEOFインジケータをクリアすると、古いEOFを読むことができます。 – Barmar

答えて

0

dbushによって提案されたものに別のアプローチ:

/* declare buffer, file and open file */ 
size_t rc; 
while (1) { 
    if ((rc = fread(buffer, 1, 16000, file)) == 0) { 
     if (feof(file))   { 
      clearerr(file); 
      usleep(100); 
     } else { 
      /* it's a real error, not EOF */ 
     } 
    } else { 
     /* process rc bytes in buffer */ 
    } 
} 
+0

私はclearerrを入れました。問題は、エディタでそのファイルを開き、(vimを使用して)追加し、保存して閉じても、プログラムをデバッグしているときに、ファイルが変更されていることがわかり、読み込みバイト数が0になる場合です。 – gbux

+0

上記のコードは、ファイルが追加されているとき(つまり、新しいデータがFILEポインタの現在の位置を超えて追加されたとき)に機能します。ファイルを編集して短くすると、 'fread'はファイルの最後を越えて読み込みを試み、変更を見ることはありません。 'tail -f'がテストケースで動作する場合、上記のコードも同様です。 – isedev

1

fseekを使用してファイルの最後にジャンプし、次にftellを使用してオフセットを表示できます。前回から変更された場合は、さらにデータがあることがわかります。

int current = 0, last = 0; 

FILE *f=fopen(filename, "r"); 
if (!f) { 
    perror("can't open file"); 
    exit(1); 
} 
while (1) { 
    fseek(f, 0, SEEK_END); 
    current = ftell(f); 
    if (current != last) { 
     printf("len=%d\n",current); 
     fseek(f, current, SEEK_SET); 
     last = current; 
     fread(buffer, 1, 16000, f); 
     .... 
    } 
    usleep(100); 
} 
関連する問題