2014-02-17 83 views
1

我有一個用visual studio編寫的C++代碼,它基本上在定時器的每個tick上寫了一組浮點數(70個浮點)到一個二進制文件。數字是從實驗完成的機器獲取的。即使在函數退出後仍保持一個流對象

WriteToFile(float* buffer, int buffersize) 
    { 
    ofstream out; 
    out.open(filename,ios::app) 
    for(int i =0;i< buffersize ;i++)  // buffersize is 70 here 
      { 
       out.precision(6); 
       out.setf(ios::fixed,ios::floatfield); 
       out.write((const char*) &buffer[i], sizeof(float)); 
      } 
    } 

這個函數被調用的timer.This的每一跳走了這麼多的時間,實驗做我甚至有後等待程序獲取數據,並且把它保存到文件。該減速的原因是,對於每一次打勾,它都需要打開二進制文件,並且必須找到之前停止的位置。如果有辦法,我可以始終打開文件並且位置指針位於相同位置以前停止的位置,我可能會加快它的速度。任何機構有任何建議嗎? 即使在函數退出後,基本上如何保持並打開流動?

+0

嘗試使用ofstream變量和位置指針作爲全局變量,並且只在函數調用之前打開文件一次? –

+0

我可以把ofstream變量作爲全局變量,但是當函數被調用一次時如何保持文件打開? – sarath

+0

有is_open()函數,這裏是參考:[ofstream :: is_open](http://www.cplusplus.com/reference/fstream/ofstream/is_open/)。您可以檢查它是否已經打開,如果尚未打開,請打開它。 –

回答

2

C++的方法是將封裝定時器功能和流對象爲一類,像這樣:

class BufferWriter 
{ 
    std::ofstream out; 

public: 
    explicit BufferWriter(const std::string& filename) 
    : out(filename.c_str(), std::ios::app) 
    { 
    out.precision(6); 
    out.setf(std::ios::fixed, std::ios::floatfield); 
    } 

    void writeToFile(float *buffer, std::size_t bufferSize) 
    { 
    for (size_t i = 0; i < bufferSize; ++i) { 
     out.write((const char*)(buffer + i), sizeof(float)); 
    } 
    } 
}; 

只需創建這個地方的一個實例,並調用其writeToFile()函數在每個時鐘滴答。當實例被銷燬時,文件將被關閉。如果需要,也可以在每個writeToFile()的末尾加上flush()

爲了詳細說明使用的情況下,你可以做到這一點的例子是這樣的:

int main() 
{ 
    BufferWriter buf("MyBufferFile.dat"); 
    Timer t = createTimer(); 
    t.setTickCallback(buf, &BufferWriter::writeToFile); // call buf.writeToFile() on each tick 
    t.start(); 
    waitUntilFinished(t); 
} 

重要的一點是對BufferWriter實例,只要整個使用定時器操作運行存在。只要BufferWriter實例存在,它的out成員也將存在,並且相應的文件將保持打開狀態。

+0

這是正確的做法。我會+1,但是我今天的選票沒有了。 –

+0

@JohnOdom謝謝;順便說一句,總有明天;-) – Angew

+0

這似乎並沒有工作,我想保持ofstream.out即使在ofstream的範圍已經結束。定義像整個ofstream.out一樣靜態? – sarath

相關問題