2010-11-16 33 views
0

我有一個C程序中生成的大量數據。我想將數據寫入1GB文件。如何暫停文件寫入時,文件達到一定的大小,然後創建一個新的文件

我怎麼會這樣做呢?

目前,我經歷了一個while循環(有一個條件將持續到創建5 gbs數據爲止)。它創建一個結構,並將其寫入文件:

fwrite(storedVal, sizeof(keyEncode),1,fp); 
//storedVal being the struct (which contains my data) 

我想每個文件被稱爲codes1,代碼2和增量,直到while循環結束。我相信它會包含一個if語句,它基於它正在寫入的當前文件的大小。然後,當它達到1GB時,它開始一個新的文件。

編輯//

實際上它應該是某種while語句,即不斷書面方式的大小,直到文件達到1GB,並開始在眼下的新

我的文件被打開之前我while循環:

fp = fopen("keys.dat", "wb"); 
while(condition is true) { 
    //create a new struct with data and 
    fwrite(storedVal, sizeof(keyEncode),1,fp); 
} 

回答

2

東西沿着以下的線 - 注意,有一些地方留出填寫

int write_count = 0; 
int file_idx = 1; 
FILE *fp; 
char filename[20]; 

sprintf(filename, "codes%d", file_idx); 
file_idx++; 
fp = fopen(filename, "wb"); 

while(foo) { 

    //update data 

    if(write_count + sizeof(keyEncode) > ONE_GIGABYTE) { 
     fclose(fp); 
     write_count = 0; 
     sprintf(filename, "codes%d", file_idx); 
     file_idx++; 
     fp = fopen(filename, "wb"); 
    } 

    fwrite(storedVal, sizeof(keyEncode),1,fp); 
    write_count += sizeof(keyEncode); 
} 

fclose(fp); 

更新

你可以合併邏輯是這樣變成一個輔助函數來寫。 ,按照Aaron的迴應。請注意,您必須使某些數據成員爲全局數據,並且它不會是線程安全的。

+0

我幾乎想要-1來代替'ONE_GIGABYTE'。 'MAX_SIZE_PER_FILE'應該是合理的,但是通過將數字的名字寫成字符串來避免幻數就是我能想到的最愚蠢的編程教條。你會寫'int x = FOURTY_TWO;'? – 2010-11-16 16:26:30

+0

是int fp,意思是File * fp ????????如果不是這是什麼 – molleman 2010-11-16 16:30:27

+0

@R「注意,有一些部分被遺漏填寫」 - 我不是在這裏命名他的變量或常量,我只是希望它清楚問題提問者應該將哪些值放在哪裏。另外一個技嘉是一個單位數字不只是一個數字 – 2010-11-16 16:32:23

1

建立了一套工作方式相同fopen()/fwrite()小助手功能,但對自己的數據結構,而不是對FILE*工作。

這允許您在結構中保存文件名,關閉實際文件並在您的fwrite()實現注意到已寫入足夠的數據時打開一個新文件。

如果你想借此在邊緣,使用幾個宏覆蓋原始的方法:

#define fopen my_fopen 

它們不能用於您的輔助功能,當然。

但它允許您編譯舊代碼並「奇蹟般」地改變它的行爲。

+0

我該如何注意1 gb被寫入 – molleman 2010-11-16 15:52:05

相關問題