2013-10-04 39 views
0

我使用CSV文件格式作爲後端目的,我應該經常更新CSV文件,所以我用文件在r+模式下打開。問題是我無法關閉CSV,如果我這樣做會導致異常處理。如果我將它打開,它會佔用導致許多問題的堆內存。pic32中的文件處理

FSFILE *tp; 
    enrowbuf=atoi(httemp); 
    FSchdir("\\"); 
    FSchdir("WWW"); 
    FSchdir("DBMS"); 
    tp = FSfopen("Status.csv","r+"); 
    if(tp!=NULL) 
     { 
     if(enrowbuf==1) 
      { 
      FSfseek(tp,(43*enrowbuf),SEEK_SET); 
      } 
     else 
      { 
      FSfseek(tp,(42*enrowbuf),SEEK_SET); 
      FSfwrite(&Relay4,48,1,tp); 
      } 
     FSfclose(tp); 
     } 
+0

FSfwrite的文檔有一個先決條件部分,它說'文件以寫入(w)或附加(a)模式打開「。所以,儘管'r +'通常與讀/寫有關,也許這個庫迫使你以'a'或'w'模式打開? –

+0

@AustinPhillips:你可以給一個URL來支持你的爭用:一個文件必須打開才能寫入或追加模式,並且不允許讀取/更新模式。如果在文件中間插入可變長度的記錄,輸出可能會出現問題,但如果'FSfwrite()'是'fwrite()'的精確模擬,那麼它應該在一份文件。由於我不清楚FS前綴的意義是什麼,我可能會吠叫錯誤的樹,但是後來我發現'a'或'a +'模式是有意義的(並且簡單的'w'或'w +'沒有)。 –

+0

@JonathanLeffler我的參考資料是http://ww1.microchip.com/downloads/en/AppNotes/01045a.pdf,p22 - 我假設這是問題中提到的庫,但我可能是錯的。不幸的是,我的經驗是,這些類型的嵌入式系統庫由於資源限制而在實現中處於非標準和切入角度而臭名昭着。 –

回答

1

我已經試過這個,它的工作正常,我以追加模式打開文件a。通過正確關閉文件來清除堆內存。

FSFILE *tp; 
    enrowbuf=atoi(httemp); 
    FSchdir("\\"); 
    FSchdir("WWW"); 
    FSchdir("DBMS"); 
    tp = FSfopen("Status.csv","a"); 
    if(tp!=NULL) 
     { 
     if(enrowbuf==1) 
      { 
      FSfseek(tp,(43*enrowbuf),SEEK_SET); 
      } 
     else 
      { 
      FSfseek(tp,(42*enrowbuf),SEEK_SET); 
      FSfwrite(&Relay4,48,1,tp); 
      } 
     FSfclose(tp); 
     }