C:从字符串名称打开文件时出错

时间:2010-10-31 05:29:55

标签: c

编辑:如何保存第一个字符串,然后使用strcat func

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,我的不好。

5 个答案:

答案 0 :(得分:2)

省略整个malloc()代码。您的代码不仅会泄漏内存,而且变量也不会保留您的文件名。

这应该有效:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这不是错误的原因,但是这段代码不符合你的想法:

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

答案 3 :(得分: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

答案 4 :(得分:0)

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