2010-11-16 16 views
0

J'ai une quantité importante de données générées dans un programme C. Je veux écrire les données dans des fichiers 1gb.Comment puis-je suspendre l'écriture de fichier lorsque le fichier atteint une certaine taille et puis créer un nouveau fichier

Comment est-ce que je ferais cela? À l'heure actuelle, je fais une boucle while (avec une condition qui continuera jusqu'à ce que les données de 5 gbs soient créées). Il crée une struct et l'écrit dans un fichier:

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

Je voudrais chaque fichier à être appelé codes1, codes2 et l'incrément jusqu'à ce que la boucle while est terminée. Je suis sûr qu'il inclurait une instruction if basée sur la taille du fichier en cours d'écriture. Puis quand il atteint 1gb, il commence sur un nouveau fichier.

modifier //

fait, il devrait être une sorte de while, qui continue à la taille ecriture, jusqu'à ce que le fichier atteint 1Go et commence le nouveau

Mon dossier au moment est ouvert avant ma boucle while:

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

Répondre

2

Quelque chose le long des lignes de ce qui suit - notez qu'il ya des parties laissés pour remplir

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); 

Mise à jour

Vous pouvez intégrer la logique comme celui-ci dans une fonction d'aide pour écrire. , selon la réponse d'Aaron. Notez que vous devez rendre certains membres de données globaux et ne pas être thread-safe.

+0

Je veux presque -1 pour 'ONE_GIGABYTE'. 'MAX_SIZE_PER_FILE' serait raisonnable, mais éviter les nombres magiques en écrivant le nom du nombre comme une chaîne est à peu près le dogme de programmation le plus idiot auquel je puisse penser. Voulez-vous écrire 'int x = FOURTY_TWO;'? –

+0

est int fp, destiné à être File * fp ???????? si non, qu'est-ce que c'est? – molleman

+0

@R "notez qu'il y a des parties à remplir" - Je ne suis pas ici pour nommer ses variables ou ses constantes, je veux juste qu'il soit clair pour la question de savoir quelles valeurs devraient aller là où . Aussi un gigaoctet est un nombre avec une unité non seulement un nombre –

1

Créer un ensemble de fonctions peu d'aide qui travaillent les mêmes que fopen()/fwrite() mais le travail sur leur propre structure de données plutôt que sur FILE*.

Cela vous permet d'enregistrer le nom du fichier dans votre structure, de fermer le fichier réel et d'en ouvrir un nouveau lorsque votre implémentation de fwrite() remarque que suffisamment de données ont été écrites.

Si vous voulez prendre ce sur le bord, utilisez quelques macros pour remplacer les méthodes originales:

#define fopen my_fopen 

Ils ne doivent pas être utilisés pour vos fonctions d'aide, bien sûr.

Mais cela vous permet de compiler l'ancien code et de changer "magiquement" son comportement.

+0

comment puis-je le remarquer 1 gb est écrit – molleman