0

Я искал большинство вопросов fopen по всей сети безрезультатно. Я пытаюсь открыть файл с fopen. Ниже приведена часть моего кода:fopen in c не работает, не работает в режиме отладки

FILE *filep = NULL; 
FILE *Compilation = NULL; 
printf("%s\n", fname); 
char *pfname = (char*)malloc(sizeof(path) + sizeof(fname)); 
pfname = concat(path, fname); 
printf("%s\n", pfname); 
filep = fopen(pfname,"r"); 
if (filep == NULL){ 
     printf("opening file failed: %s\n", strerror(errno)); 
} 
printf("%p\n", filep); 

Я использую Visual Studio express 2012 как свою IDE. Когда я запускаю это без отладки. Он сбой после печати конкатенированного pfname. Однако, когда я запускаю это в режиме отладки, он работает. filep не возвращает NULL и будет распечатывать адрес памяти. У меня есть еще один fopen после printf и в режиме отладки он также работает. Может ли кто-нибудь помочь мне понять, что происходит? Файл есть, права правильные. Это более новая версия кода, но ранее перед некоторыми невоспроизводимыми изменениями работа fopen работала. Спасибо заранее.


пересмотренный код

FILE *filep = NULL; 
FILE *Compilation = NULL; 
printf("%s\n", fname); 
char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1); 
pfname = concat(path, fname); 
printf("%s\n", pfname); 
filep = fopen(pfname,"r"); 
if (filep == NULL){ 
     printf("opening file failed: %s\n", strerror(errno)); 
} 
printf("%p\n", filep); 
char *newfile = (char*)malloc(strlen(path) + 11); 
newfile = concat(path, "Result.txt"); 
Compilation = fopen(newfile, "a"); 

Он по-прежнему не могут получить пройти Еореп, потому что он не печатает указатель.

+0

Покажите нам код 'concat()' – ctn

+0

Где вы получаете значения для ваших 'fname' и' path'? –

+0

'sizeof (path)' будет размером указателя, если 'path' имеет тип' char * '. Возможно, вы имели в виду 'strlen (path) + strlen (fname) + 1'. – ctn

ответ

0

Проблема эта линия:

char *pfname = (char*)malloc(sizeof(path) + sizeof(fname)); 

sizeof функция в С является размер типа данных. В этом случае тип данных является указателем (я предполагаю). Так что это 4 в 32-битной системе или 8 в 64-битной системе. Я видел это заблуждение несколько раз здесь, на StackOverflow.com, что означает sizeof.

Чтобы исправить это, вам нужно:

char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1); 

Поскольку ваша окончательная строка (что указывает на pfname) должна быть длина обеих строк, плюс байт держать нулевые окончания.

Существующая линия:

pfname = concat(path, file); 

перезаписывает выделенный указатель, который был введен в pfname. Новый путь к файлу должен быть вычислен следующим образом:

strcpy(pfname, path); // Copy the path to the newly allocated file path buffer 
strcat(pfname, file); // Concatenate the file name to the path 

Я предполагаю, что path заканчивается в нужной директории разделители характера. В противном случае это нужно будет вычислить, выделив дополнительный знак для pfname и объединив \.

Такая же логика применима к вашей последующей логике файлов для компиляции.

+0

Я только что внедрил его. На этот раз fopen возвратил NULL, и это потому, что путь не заканчивается с \, а fname не начинается с a \. Чтобы исправить это, я добавил один дополнительный 'strcat (pfname, "\\"); но это снова разбило программу. Это сузило проблему. Я добавил 2 к моему malloc pfname вместо 1 в конце. спасибо mbratch за помощь – user2127579

+0

@ user2127579 звучит хорошо. :) – lurker

+0

Теперь код фактически останавливается в if-statment из 'if ((filep == NULL) {' Он останавливает точки malloc.c в строке 'res = _heap_alloc (size)' – user2127579

0

Использование sizeof() для определения необходимого места для pfname неверно. У меня должны быть объявления path и fname, но они либо указатели, то вы получите размер указателя (4 или 8) или массивы, тогда вы получите полный размер массива. Вместо этого используйте malloc(strlen(path)+strlen(fname)+1).