C: Ошибка открытия файла с именем строки - PullRequest
2 голосов
/ 31 октября 2010

Отредактировано: как сохранить первую строку, а затем использовать функцию strcat

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 ]

2 голосов
/ 31 октября 2010

Не указывайте весь код malloc ().Не только ваш код утечки памяти, но переменная не содержит вашего имени файла.

Это должно работать:

forig = fopen(mydata->fname,"r");
1 голос
/ 31 октября 2010

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
1 голос
/ 31 октября 2010

Это не причина ошибки, но этот код не делает то, что вы думаете:

char *file_name;
file_name = (char*)malloc( sizeof(char) * 10 ); 
file_name = mydata->fname;
1 голос
/ 31 октября 2010

Проверьте errno, чтобы узнать причину сбоя. См. Справочные страницы fopen(3), open(2) и malloc(3) для возможных значений.

0 голосов
/ 31 октября 2010

Убедитесь, что файл, который вы пытаетесь открыть, находится в текущем рабочем каталоге.Что произойдет, если вы используете полный путь к файлу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...