2010-11-01 5 views
0

Im faire une application qui utilise des threads API en C, Le programme prend N-fichiers (N> 2) avec des noms désordonnés, par chaque fichier est généré un fil d'exécution qui trient le fichiers en utilisant la fonction qsort, après avoir été ordonné des fichiers, chaque thread devrait créer un fichier en gardant le fichier original intact et en affichant le fichier trié dans un autre fichier avec l'extension < .sorted>. Le programme trie les numéros sans problèmes, même si je mets la sortie standard affiche le résultat à l'écran, mais quand j'essaye de créer le fichier de sortie avec l'extension .sorted le programme éclate.Gestion de fichier en utilisant le fil API dans C

c'est mon code file.c

#include <stdio.h>    /* Standard buffered input/output  */ 
#include <stdlib.h>    /* Standard library functions   */ 
#include <string.h>    /* String operations      */ 
#include <pthread.h>  /* Thread related functions    */ 
#include "pf1.h"  /* Header specific to this app   */ 



pthread_attr_t attr; 

void *thread_worker(void *name_file) 
{ 

FILE *entrada, *salida; 
char* nombres = (char*)name_file; 
int numero; 
char temp [10000]; 

int i; 
stats_t estadisticas; 

printf ("File_name:%s\n", nombres); 
entrada = fopen(nombres, "r"); 
salida = fopen (strcat(nombres, ".sorted"), "w"); 

while (!feof(entrada)){ 
fscanf (entrada, "%s\n",temp); 
numero++; 
} 

char* lista[numero]; //array to sort the file 
rewind (entrada); 

    for (i=0;i<numero;i++) 
    { 

     fscanf(entrada," %[^\n]", temp); 


     lista[i] = (char*)malloc((strlen(temp)+1)*sizeof(char)); 

     strcpy(lista[i], temp); 

    } 


size_t large = sizeof(lista)/sizeof(char *); 



qsort(lista,large ,sizeof(char *) ,cstring_cmp); 

printf ("Archivo Ordenado\n", i+1); 

for (i=0;i<large;i++) 


printf("%s\n",lista[i]); 


pthread_exit(NULL); 
} 


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

stats_t **stats; 
int i, rc; 
pthread_t my_threads[argc-1]; 
pthread_attr_init(&attr); 

if (argc <3) { 
printf ("|files| > 2\n"); 
}else{ 
printf("files to sorted: %d\n", argc - 1); 

for (i = 1; i < argc; i++){ 

    //printf("%s%s\n", argv[i], (i < argc-1) ? " " : ""); 

rc = pthread_create(&my_threads[i], &attr, thread_worker, (void *)argv[i]); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n",rc); 
     return -1; 
     } 
} 

} 
    return 0; 

} /*end main */ 

c'est mi fichier.h

#ifndef PF1_H_ 

#define PF1_H_ 





typedef struct _stats_t 

{ 

    char *longest, *shortest; 

    unsigned int numlines; 

} stats_t; 

int cstring_cmp(const void *a, const void *b) 

{ 

    const char **ia = (const char **)a; 

    const char **ib = (const char **)b; 

    return -strcasecmp(*ia, *ib); 

    /* strcmp functions works exactly as expected from 

    comparison function */ 

} 


void print_cstring_array(char **array, size_t len) 

{ 

    size_t i; 



    for(i=0; i<len; i++) 

     printf("%s | ", array[i]); 



    putchar('\n'); 

} 




#endif /* PF1_1_H_ */ 

Je voudrais un peu d'aide à ce problème parce que je ne vois pas qui est la faute .. Merci à tous à l'avance et excusez mon anglais

Répondre

3

Cette ligne ici peut être votre problème:

salida = fopen (strcat(nombres, ".sorted"), "w"); 

D'après ce que je peux dire, cette variable nombres est en provenance de argv. Puisque vous n'êtes pas celui qui alloue la mémoire pour argv, vous ne savez pas qu'il y aura de l'espace supplémentaire pour le ".sorted" (et il n'y en aura probablement pas). Si vous strcpy à votre propre tampon avec un espace pour le ".sorted", vous devriez aller bien.

#define EXT_LEN 7 
#define MAX_TOTAL_LEN 250 
#define MAX_FILE_LEN 242 //MAX_TOTAL_LEN - EXT_LEN - 1 

char *name_ptr; 
char nombres[MAX_TOTAL_LEN]; 
int len; 

name_ptr = (char*)name_file; 
len = strlen(name_ptr); 
if (len > MAX_FILE_LEN) { 
    len = MAX_FILE_LEN; 
} 
strncpy(nombres, name_ptr, len); 
strcpy(nombres+len, ".sorted"); 
salida = fopen (nombres, "w"); 
+0

Bon point. Je n'ai pas remarqué cela en regardant son code. – Mauren

+0

désolé mais je ne peux pas comprendre votre idée ... désolé Im newbie at this – franvergara66

+0

Lorsque vous utilisez 'strcat', les caractères supplémentaires doivent être placés dans la mémoire quelque part. Si vous n'allouez pas assez de mémoire sur la pile en utilisant un tableau, ou sur le tas en utilisant 'new' /' malloc', alors vous risquez d'écraser d'autres choses (comme l'adresse de retour). Lorsque les arguments sont passés en tant que 'argv', il y a généralement assez de place dans ces chaînes pour l'argument, pas de place supplémentaire. En ajoutant ".sorted" à la fin de cela, vous écrivez en mémoire que vous n'avez pas attribué et écrasez les choses que vous ne devriez pas. – user470379

0

J'ai déjà eu des problèmes de ne pas passer un identifiant int lors de l'appel des fonctions d'exécution de thread. Essayez de construire une structure avec à la fois un identifiant entier et le nom du fichier, puis passez-le en tant que paramètre à votre fonction thread_worker().

Questions connexes