2010-10-31 50 views
2

编辑打开文件:我怎样才能挽救第一个字符串,然后使用strcat的FUNCC:错误从字符串名称

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 

现在输出的是:

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 

的问题是如何能我保存第一个字符串,然后使用strcat,我的不好。

+1

在NULL检查中做一个'perror(“fopen”);'' – BobbyShaftoe 2010-10-31 05:33:32

回答

1

的strcat()不分配一个新的字符串,其追加的第二个 “.sorted” 字符串第一。 strcat()的返回值将是与第一个字符串参数相同的字符串指针。你对strcat()的使用很可能是通过在mydata-> fname的末尾写入来破坏内存。

有关如何为final_file分配新字符串的示例,请参阅下面的代码。

#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

感谢Neo现在,这是一个明确的代码! – g0d1anier 2010-10-31 06:53:49

1

检查errno以获得失败的原因。请参阅fopen(3),open(2)malloc(3)手册页以了解可能的值。

0

确保您尝试打开的文件位于当前工作目录中。如果使用文件的完整路径会发生什么?

1

这不是错误的原因,但是这个代码没有做什么你认为它的作用:

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

离开了整体的malloc()的代码。你的代码不仅会泄漏内存,而且变量也不会保存你的文件名。

这应该工作:

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

我试过,但没有工作,谢谢,问题是,我宣布另一个字符串,我没有把代码放在这里,做一个strcpy,我会编辑代码 – g0d1anier 2010-10-31 06:03:57

+0

不是strcpy,但strcat – g0d1anier 2010-10-31 06:14:35