2010-10-31 1 views
2

Edité: Comment puis-je enregistrer la première chaîne, puis utilisez le strcat funcfichier C: Erreur d'ouverture du nom de la chaîne

void *threads_sorting (void *arg) { 
struct args_sort *mydata; 
mydata = (struct args_sort *) arg; 

FILE *forig 
char *file_name; 

//file_name = (char*)malloc(sizeof(char) * 10); 
file_name = mydata->fname; 
printf ("File Name: %s\n", file_name); 

char *final_name; 
//final_name = (char*)malloc(sizeof(char) * 20); 
final_name = file_name; 
final_name = strcat(final_name, ".sorted"); 
printf ("File Name: %s\n", file_name); 
printf ("FInal Name: %s\n", final_name); 

forig = fopen(file_name,"r"); 
    if(forig==NULL) 
{ 
    printf("Unable to open file\n"); 
    exit(1); 
} 
}//end of function 

Maintenant, la sortie est:

File Name: arch1.txt 
File Name: arch1.txt.sorted //that's why it doesn't open 
Final Name: arch1.txt.sorted 
Unable to open file 

La question est de savoir comment peut je sauve la première chaîne et puis utilise strcat, mon mauvais.

+1

Faites un 'perror (" fopen ");' dans votre vérification NULL. – BobbyShaftoe

Répondre

1

strcat() n'alloue pas une nouvelle chaîne, il ajoute la deuxième chaîne ".sorted" au premier. La valeur de retour de strcat() sera le même pointeur de chaîne que le premier paramètre de chaîne. Votre utilisation de strcat() a probablement corrompu la mémoire en écrivant au-delà de la fin de mydata-> fname.

Voir le code ci-dessous pour un exemple d'allocation d'une nouvelle chaîne pour le fichier final.

#define FILE_SORTED_EXT ".sorted" 
void *threads_sorting (void *arg) { 
struct args_sort *mydata; 
mydata = (struct args_sort *) arg; 

FILE *forig 
char *file_name; 
char *final_name; 

file_name = mydata->fname; 
printf ("File Name: %s\n", file_name); 

// Allocate space for "sorted" file_name. 
final_name = malloc(strlen(file_name) + strlen(FILE_SORTED_EXT) + 1); 
// append .sorted extentsion to file name. 
strcpy(final_name, file_name); 
strcat(final_name, FILE_SORTED_EXT); 

printf ("File Name: %s\n", file_name); 
printf ("FInal Name: %s\n", final_name); 

forig = fopen(file_name,"r"); 
if(forig==NULL) 
{ 
    free(final_name); // make sure to cleanup allocated memory. 
    perror("threads_sorting(): Unable to open file\n"); 
    exit(1); 
} 
// TODO: do something with forig FD and final_name. 

free(final_name); // make sure to cleanup allocated memory. 
}//end of function 
+0

Merci Neo maintenant c'est un code clair! – g0d1anier

1

Vérifiez le errno pour connaître la cause de l'échec. Voir les pages de manuel fopen(3), open(2), et malloc(3) pour les valeurs possibles.

0

Assurez-vous que le fichier que vous essayez d'ouvrir se trouve dans le répertoire de travail actuel. Que se passe-t-il si vous utilisez le chemin d'accès complet au fichier?

1

Ce n'est pas la cause de l'erreur, mais ce code ne fait pas ce que vous pensez qu'il fait:

char *file_name; 
file_name = (char*)malloc(sizeof(char) * 10); 
file_name = mydata->fname; 
2

Laissez le code tout malloc(). Non seulement votre code fuit la mémoire, mais la variable ne contient pas votre nom de fichier.

Cela devrait fonctionner:

forig = fopen(mydata->fname,"r"); 
+0

J'ai essayé mais ça n'a pas fonctionné, merci, le problème est que je déclare une autre chaîne que je n'ai pas mise ici dans le code et qui fait un strcpy, je vais éditer le code – g0d1anier

+0

n'est pas strcpy mais strcat – g0d1anier

Questions connexes