2010-07-25 58 views
0

我有一個普通的IO問題。我試圖用ascii編碼的文件替換單行。經過多次搜索,我發現這是不可能的。根據我讀到的內容,如果需要在文件中替換一行,整個文件需要重寫。我讀過這對所有操作系統都是一樣的。 \ nIO問題:寫入一個文件的一部分

什麼讓我再次想知道這是我一直在使用「.dat」和「 .idx「文件的數據庫。該程序不斷讀取和寫入數據庫。所以我的問題是,它顯然需要一次只寫入小部分(db大小約爲200mb),因此每次寫入整個文件都不是有效的。所以我的問題是,像這樣的程序對於這樣的問題有什麼樣的解決方案。它會寫入內存,然後每次都重寫整個數據庫。它會編寫臨時文件,然後在某個時候將它們合併到數據庫中?或者是否可以編寫db中的單個(或多個)行而不寫入整個文件?

關於此任何信息將不勝感激!

THX

NT

回答

0

這是不正確的NTMP。你確實可以在文件的中間寫入。你怎麼做取決於你使用的系統和編程語言。你正在尋找的可能是IO中的操作。

那麼你不會完全重寫整個文件。只有您開始插入的文件的其餘部分,因爲該部分需要移到插入內容的後面。

有幾種方法可以解決這個問題,例如,可以在文件中保留空間(使文件變大)。這樣,您只需在佔位符區域填寫完成後移動數據。

再寫一點,我們可能會幫助你。

+0

請記住,您只能替換文件中的東西(或附加到它) - 不刪除或插入東西因此,如果你想替換一個「行」,你的新行將必須具有與舊的一。 – nos 2010-07-25 23:33:57

1

「你必須重寫整個文件」的一般註釋適用於當你要替換的行長度爲L1並且你添加的行長度爲L2並且L1≠L2時。麻煩的是,如果L1大於L2,那麼必須將文件的其餘部分的數據向下移動到文件中,以避免在行尾處留下垃圾(並且必須切掉尾部)該文件 - 縮短它,以避免在最後留下垃圾)。相反,如果L1小於L2,則必須在排列文件後移動這些行,以避免新行覆蓋下一行的開頭。

但是,在.dat和.idx文件的情況下,您會發現確實如此:軟件不會每次都重寫整個文件。文件代表C-ISAM文件或相關係統之一(D-ISAM,T-ISAM等)的可能性很小。在原始(Informix)C-ISAM中,.dat文件包含固定長度的記錄,因此可以用新記錄覆蓋任何舊記錄,因爲L1 = L2,始終如此。 .idx文件比較複雜,但它被分成頁面(可能每頁只有512字節),當需要編輯時,整個頁面都會被重寫。由於這些頁面的大小都是相同的,所以L1 = L2 - 並且對重寫只是變化的索引文件部分是安全的。

當C-ISAM文件包含可變長度數據時,記錄的固定部分存儲在.dat文件中,並且數據的可變長度部分存儲在.idx文件的頁面中。這種安排只有一個優點 - 它將.dat文件中的記錄保留爲固定大小。

+0

非常感謝您的有用信息! – ntmp 2010-07-26 22:20:22

+0

@ntmp:在StockOverflow和相關網站上顯示讚賞的方式是通過投票有用的答案(可能提出一個問題的幾個答案),然後選擇(通過點擊白色的勾號,你點擊了它)最有用的答案。 – 2010-07-27 00:34:17