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을 반환하지 않으며 메모리 주소를 인쇄합니다. 나는 printf 다음에 또 다른 fopen을 가지고 디버그 모드에서도 작동한다. 아무도 내가 무슨 일이 일어나는지 이해하도록 도와 줄 수 있습니까? 그 파일은 거기에 있습니다, 권한은 옳습니다. 이것은 코드의 새로운 개정이지만 일부 변경되지 않은 변경 사항이 있기 전에는 fopen이 작동했습니다. 미리 감사드립니다.


는 포인터를 인쇄하지 않기 때문에 여전히 과거 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

'path'의 타입이'char *'인 경우'sizeof (path)'는 포인터의 크기가됩니다. 아마도'strlen (path) + strlen (fname) + 1'을 의미했을 것입니다. – ctn

답변

0

문제점은이 라인이다. 이 경우 데이터 유형은 포인터입니다 (필자는 가정합니다). 따라서 32 비트 시스템에서는 4, 64 비트 시스템에서는 8입니다. 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을 반환했으며 path가 \로 끝나지 않고 fname이 \로 시작하지 않기 때문입니다. 이 문제를 해결하기 위해 추가로 'strcat (pfname, "\\"); 그러나 그것은 프로그램을 다시 추락시켰다. 이것은 문제를 좁혔다. 마지막에 pfname 대신 malloc에 ​​2를 더했습니다. 도와 주셔서 감사합니다. – user2127579

+0

@ user2127579 좋은 소리입니다. :) – lurker

+0

이제 코드는 if-statment of 'if ((filep == NULL) {'에서 멈 춥니 다. 'res = _heap_alloc (size)'의 줄에있는 malloc.c에 중단 점이 발생합니다. – user2127579

0

pfname에 필요한 공간을 결정하기 위해 sizeof()을 사용하는 것은 잘못된 것 같습니다. 나는 pathfname이라는 선언을 가지고 있어야하지만 포인터가 아니면 포인터 크기 (4 또는 8)를 얻거나 배열이므로 완전한 배열 크기를 얻을 수 있습니다. 대신 malloc(strlen(path)+strlen(fname)+1)을 사용하십시오.

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

C의 sizeof 함수는 데이터 유형의 크기 :

관련 문제