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
Bon point. Je n'ai pas remarqué cela en regardant son code. – Mauren
désolé mais je ne peux pas comprendre votre idée ... désolé Im newbie at this – franvergara66
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