2010-11-16 79 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