2016-09-28 37 views
-1

我一直在盯着這長...在C++中打開/保存到二進制文件間歇性地失敗

我做了一個程序,記錄來自不同傳感器的天氣數據。它處理雙鏈表中的數據並將其保存到二進制文件中。爲了存儲數據的不同「壓縮」,使用不同的文件。例如沒有壓縮,小時,天等。

主程序首先加載正確文件的內容(由WeatherSeries構造函數定義)並將文件中的所有內容添加到鏈表中。然後添加新元素,然後保存全部。它添加到從最舊到最新的列表中,並且在文件中它也被保存,所以最新的記錄是最後被添加到文件中的記錄。

發生的錯誤是,似乎我失去了幾個小時的記錄數據。我觀察到數據已經存在。即看到有數據記錄在例如9PM和10PM,然後在這個數據消失後的早上。

奇怪的是以下內容:

  • 錯誤只發生間歇性並且僅用於相比於溼度和溫度傳感器,其與四個數字值提供遞送與6位數字值的氣壓傳感器。

  • 它只發生了「不壓縮」,並且從來沒有發生任何其他壓縮。這意味着從傳感器檢索數據的程序起作用。另外它意味着將數據添加到雙鏈表的功能起作用。

左邊是打開並保存數據到文件的功能。

你能否看到如果你能在我的代碼中發現任何錯誤?

void weatherSeries::saveSeries() 
    { 
    ostringstream s; 
    s << "WLData/" << mSensorNbr << "_" << mSensorType << "_" << mTimeBase << ".dat"; 

    ofstream file(s.str().c_str(), ios::out | ios::trunc | ios::binary); 

    if (!file) 
    { 
     file.clear(); 
     file.open(s.str().c_str(), ios::out | ios::trunc | ios::binary); 
    } 

    if(file.is_open()) 
    { 
     for (current = tail; current != NULL; current = current->prev) 
     { 
      file.write((char*)&current->time_stamp, sizeof(time_t)); 
      file.write((char*)&current->val_avg, sizeof(double)); 
      file.write((char*)&current->min, sizeof(double)); 
      file.write((char*)&current->max, sizeof(double)); 
      file.write((char*)&current->nbrOfValues, sizeof(unsigned long int)); 
     } 
    } 
    else 
    { 
     cerr << "Unable to open for saving to " << mSensorNbr << "_" << mSensorType << "_" << mTimeBase << ".dat"; 
    } 

    file.close(); 
} 


void weatherSeries::openSeries() 
{ 
    deleteAll(); 

    ostringstream s; 
    s << "WLData/" << mSensorNbr << "_" << mSensorType << "_" << mTimeBase << ".dat"; 

    ifstream file(s.str().c_str(), ios::in | ios::binary); 

    if (!file) 
    { 
     file.clear(); 
     file.open(s.str().c_str(), ios::in | ios::binary); 
    } 

    if(file.is_open()) 
    { 
     time_t tmp_TS = 0; 
     double tmp_val_avg = 0; 
     double tmp_min = 0; 
     double tmp_max = 0; 
     unsigned long int tmp_nbrOfValues = 0; 
     while (file.read((char*)&tmp_TS, sizeof(time_t))) 
     { 
      file.read((char*)&tmp_val_avg, sizeof(double)); 
      file.read((char*)&tmp_min, sizeof(double)); 
      file.read((char*)&tmp_max, sizeof(double)); 
      file.read((char*)&tmp_nbrOfValues, sizeof(unsigned long int)); 
      addToSeries(tmp_TS, tmp_val_avg, tmp_min, tmp_max, tmp_nbrOfValues, true); 
     } 
    } 
    else 
    { 
     cerr << "Unable to open for opening from " << mSensorNbr << "_" << mSensorType << "_" << mTimeBase << ".dat"; 
    } 

    file.close(); 
} 

注意:deleteAll()清除雙鏈表。

+0

爲什麼需要這樣:if(!file)....? – GpG

+0

我想你應該寫一個單元測試,並檢查這兩個函數是否真的是問題的原因。 – GpG

+0

if(!file)被添加爲一個嘗試擺脫問題,如果它必須與文件的打開。我找不到推薦的線程引用,但或多或​​少它應該清除文件中的任何標誌,然後再次嘗試打開。 – user3769000

回答

0

你是對的。該錯誤在程序的另一部分中找到。當我開始在代碼中記錄不同的東西時。

或多或少的不同機制實例化程序,它碰巧發生在同一時間,導致文件被同時處理實例。