響應例如寫了以請求 - 假設固定大小記錄:
enum { RECSIZE = 256 };
char buffer[RECSIZE];
FILE *fp = ...; // File to read from and write to
int recnum = 37; // Counting from record 0
long offset = recnum * RECSIZE;
if (fseek(fp, offset, SEEK_SET) != 0)
...error...
if (fread(buffer, sizeof(buffer), 1, fp) != 1)
...error...
...modify buffer...
if (fseek(fp, offset, SEEK_SET) != 0)
...error...
if (fwrite(buffer, sizeof(buffer), 1, fp) != 1)
...error...
重複從recnum
聲明代碼來結束一次必須修改每個記錄(認爲循環)。
對於可變大小的記錄,在編輯它們時會改變大小,因此您必須更加努力地工作 - 以便將舊文件一次複製到內存中一條記錄可能會更簡單,適當地修改記錄,然後將修改後的記錄寫入新文件。
CSV通常包含純文本。它是逗號分隔值的簡稱。無論如何,除非你知道那裏是什麼,否則lseek和fseek不會跳到正確的位置。此外,如果您增加記錄大小(例如,當您添加1到9並獲得10)時,您將遇到麻煩。 – xscott 2010-10-18 02:20:19
如果你需要堅持使用CSV,我會計劃逐行閱讀文件,並逐行寫入。當你找到一個匹配的,你可以適當地改變它。 – xscott 2010-10-18 02:21:17
用真實的數據庫格式真正解決了這類問題。我推薦Sqlite。但是,如果你剛剛入門,這將是一個學習曲線。 – xscott 2010-10-18 02:22:15