2010-11-01 13 views
0

J'ai n fichiers et mon programme doit fusionner le contenu de tous dans un fichier en utilisant les threads et les fichiers temporaires (utiliser tmpfile()). Lors de la création d'un thread, il doit fusionner 2 fichiers dans un fichier temporaire (temp1) puis un autre thread fusionnera les 2 fichiers suivants dans un autre fichier temporaire (temp2) et ainsi de suite, puis au prochain niveau un autre thread fusionnera temp1 avec temp2 un autre fichier temporaire.C: fusion de fichiers temporaires créés avec la fonction tmpfile() avec multithreading

alt text

Je pensais à la création d'un tableau de noms de fichiers en passant à pthread_create comme argument, et la fonction doit retourner le tableau trop modifié, mais je ne peux pas comprendre comment obtenir le nom de tempfile. Est-ce que quelque chose comme ceci:

int main(int argc, char *argv[]){ 

int n = argc -1; 

char *files_arr[n]; 

pthread_t threads[n-1]; 

} 

    for (int i=0; i < argc; i++) 

    { 
     pthread_create (&threads[i], NULL, temp_merge, (void *) &files_arr); 
    } 
}//end main 

void *temp_merge (void *arg){ 

    char *myarray[]; 
    myarray = (char *) arg; 
    FILE *f1, *f2, *tf; 
    tf = tmpfile(); 

    //code to merge f1 and f2 into tf, f1 and f2 could be temp files created before 

    pthread_exit((void*) myarray); //Do I lose the temp file using pthread_exit? 
} 

La question est: Comment puis-je accéder à un fichier temporaire openned avant avec tmp() dans un thread précédent pour générer de nouveaux fichiers temporaires?

+0

"Je n'arrive pas à comprendre comment obtenir le nom du fichier temporaire." - Vous ne pouvez pas, en général C'est le point de tmpfile –

+0

C'est vrai Paul, alors comment puis-je "stocker" ces fichiers temporaires pour les lire plus tard? – g0d1anier

+0

créer un tableau de noms enregistrés. après chaque étape, fusionnez ces fichiers dans les nouveaux fichiers (en les sauvegardant au fur et à mesure). le mot "récursif" vient à l'esprit ici;) – KevinDTimm

Répondre

1

Pourriez-vous utiliser tmpnam() au lieu de tmpfile() et d'ouvrir/fermer/supprimer manuellement des fichiers si nécessaire?

+1

Ou nous pourrions utiliser un tableau global de FICHIER * FICHIER * pour tmp fichiers, et passer dans la paire d'index qui sont nécessaires par le thread fusionnant les deux fichiers temporaires. – Sudhanshu

+0

@Sudhanshu Eh bien en tant que tableau global je ne sais pas encore la taille du tableau mais je pourrais utiliser un malloc, alors vous dites que je peux avoir accès aux pointeurs de contenu de fichiers? pourrait être. @Oli je faisais une recherche sur tmpnam() et j'ai le problème de savoir comment obtenir le nom du fichier temporaire. – g0d1anier

+0

@ g0d1anier: http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/. C'est une référence C++, mais c'est fondamentalement la même idée. –

0

Vous avez la liste des fichiers pour commencer (je suppose), donc vous allez tous les ouvrir (retour FILE *).

Dans votre fonction mergesort (MSF), tmpfile() renvoie un FILE * qui doit être renvoyé par votre MSF. Ainsi, votre valeur de retour de MSF devient l'une des deux entrées de votre prochaine invocation de MSF. Cela continue jusqu'à ce que vous n'ayez qu'un seul FILE * à agir.