2015-02-11 33 views
0

記錄器爲我的程序。我在另一個程序中看到,當程序仍在使用它時,可以用文本編輯器打開和讀取文件。似乎它只是爲我打開一份副本,並繼續在後臺登錄。我也需要這種日誌系統。但是,如果我使用fopen(),如果Programm已經用fclose()關閉了它,我只能打開並用我的文本編輯器讀取文件。這種方式可行,但我認爲它是一個非常糟糕的解決方案,也非常緩慢......打開和關閉每個日誌上的文件:S 有人知道所需的日誌系統是如何工作的?使用texteditor打開一個txt文件,而其已經打開「fopen()」並正在使用?

P.S.我在VisualStudio的2013工作在Windows 8.1

Sry基因爲我的英語不好:S

+0

也許尾巴-f? – willll 2015-02-11 14:43:35

回答

0

這一切都取決於你所使用的文本編輯器。有些人會注意到對該文件的編輯並詢問您是否要重新加載新版本。

如果你在Linux上工作,你想有什麼發生在實時,你可以做些事情像

tail -f <path-to-file> 

,或者如果一個想法文件犯規還不存在

watch -n 0,2 "cat <path-to-file> | tail" 

這將顯示文件的內容並刷新它每0.2秒

+0

嗯文件甚至不存在,直到我做了fclose():S所以我不能打開它。我使用msnotepad.exe。如果我使用setbuf(pFile,NULL);那麼它會創建該文件,但它始終爲空,直到程序用fclose()克服它:S – Bluefire 2015-02-11 14:49:29

1

有2個不同的問題。

首先是寫日誌。在Windows系統中,緩衝會導致數據實際寫入到磁盤:

  • 如果您關閉該文件
  • 當你有新的數據的合理數量(幾個KO和幾個莫之間不確定)
  • 如果你明確的沖洗

除非如果你有一個高吞吐量,我建議至少每沖洗後(如果不關閉)寫以免丟失,如果程序崩潰日誌。它還允許您實時讀取日誌文件。

其次是閱讀。已知Vim能夠監視可以被外部進程修改的文件。它會打開一個彈出窗口,說該文件已被修改並提供重新加載它。我不知道在同樣條件下記事本的功能。但是:

  • 它沒有意義,除非第一個問題已經
  • 不是很有效,因爲你每次都會重新加載整個文件

恕我直言,你最好寫一個自定義閱讀器模仿的Linux tail -f

  • 讀取(和顯示),直到文件結束
  • repeteadly讀取(具有短SLE在讀取失敗後EP)來處理新添加的數據
0

THX爲您快速的解答:) 瘋了..我正在用的fopen這麼久()並沒有發現任何解決方案..也fflush(PFILE)didnt幫助(我無法打開文件..總是錯誤,它已被另一個程序使用)。我從來沒有嘗試過fstream。似乎fstream現在解決了我的問題。我可以用msnotepad.exe打開我的文件,同時程序仍在寫入文件:)這裏有一個小測試代碼:

#include <fstream> #include <iostream> using namespace std; 
int main(){ 
ofstream FILE; 
FILE.open("E:\\Log.txt"); 
for (size_t i = 0; i < 50; i++) 
{ 
    FILE << "Hello " << i << endl; 
    cout << "log" << endl; 
    _sleep(500);   
} 
FILE.close(); 
cout << "finish" << endl; 
return 0;} 
+0

您錯誤的根本原因是在文件的共享模式下 - 對我來說也很令人驚訝 - 由兩個API分別處理。在底層windows API中負責這個標誌是dwShareMode,請參閱https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx。爲了能夠使用日誌查看器打開文件(我建議試一試裸露)或編輯器,而它是由程序打開的,它必須設置爲FILE_SHARE_READ。 – Sigismondo 2015-02-11 15:58:05