2017-01-11 1 views
-1

텍스트 파일에서 readfilename이 필요합니다. 그렇다면 fopen의 인수로 사용해야합니다. 결과적으로 이 첫 번째 인수로 받아 들여지므로 const char*으로 읽어야합니다. 어떻게해야합니까?파일에서 const char * 읽는 법

FILE *a; 
a=fopen("a.txt","r"); 
const char *filename 
fgets(filename,100,a); 
image=fopen(filename,"rb"); 

뭔가 내가이 작업을 수행 할 때이 세그먼트 오류를 ​​받기로 잘못입니다 :

내가 좋아하는 뭔가를 시도했다. 나는 filename 변수가 fopen 함수에 의해 잘 수신되지 않았다고 생각한다.

+3

'const char * filename' ->'char filename [100];'.또한'filename'이 개행을 포함하고 있다면, 그것을 제거해야합니다. – BLUEPIXY

+0

그 코드가 잘못되었다는 것을 알고 있습니다. 올바른 대안을 알고 싶습니다. –

+1

@LazuRazvan C에서 상수 ('const') 사용법을 읽어 보시기 바랍니다. "C로 const 사용하기"라는 검색 결과가 있습니다. . –

답변

0

fopen()(const char *) 유형의 인수를 사용하지만 함수에 전달하기 전에 문자열을 수정할 수 있어야합니다. 또한 문자열에 공간을 할당해야하며 1000char 초 이상의 공간을 할당하는 것이 좋습니다. stdio.h 헤더 파일에는 FILENAME_MAX 매크로가 포함되어 있습니다.이 정수는 시스템에서 가능한 가장 긴 파일 이름 문자열을 포함 할 배열에 대해 올바른 크기의 정수 상수로 확장됩니다. 예를 들어 char filename[FILENAME_MAX];을 사용할 수 있습니다. fopen()에 대한 호출에서 식별자 filename이 발생하면 함수 프로토 타입에 따라 const char에 대한 포인터로 변환 된 char에 대한 포인터로 사라집니다.

또한 fgets()은 텍스트 줄을 가져 오는 경우 줄 바꿈을 유지하므로 제거해야합니다. fgets()의 결과를 확인해야합니다. 오류가 발생하거나 포인터가 파일 끝에서 호출 된 경우 NULL 포인터를 반환합니다. 그렇지 않으면 char의 포인터를 filename[]에 반환합니다.

FILE *a; 
a=fopen("a.txt","r"); 
char filename[FILENAME_MAX]; 
char *ch; 

ch = fgets(filename,FILENAME_MAX,a); 

/* Remove trailing newline */ 
if (ch) { 
    while (*ch != '\0' && *ch != '\n') { 
     ++ch; 
    } 
    if (*ch == '\n') {     // replace '\n' with '\0' 
     *ch = '\0'; 
    } 
    image=fopen(filename,"rb"); 
} 
0

먼저, 사용자가 소유하지 않은 메모리를 사용하려고하면 seg 오류가 발생할 가능성이 높습니다. 즉 변수를 만들어 : 그것을 사용하기 전에 그것을 어떤 메모리 ([c][m]alloc)를 제공

const char *filename; 

을 그리고 없습니다.

진술 내용 :
따라서 const char *으로 읽어야합니다.

반드시 그렇지는 않습니다.
fopen 원형의 첫번째 인수 : "FILE *fopen(const char *filename, const char *mode)" 단순히 그 위치에 전달 인자가 fopen 함수 내의 const char *로서 취급 될 것임을 보장한다. 인수는 간단한 char *을 사용하여 전달할 수 있습니다. 이러한 양식 중 하나를 :

char *filename = {"somefilename.txt"}; 

또는

char filename[80]; 
strcpy(filename, "somefilename.txt"); 

그리고 의견에 언급, 기타 답변으로, 인수로 전달하기 전에 개행 문자, \n를 제거합니다.

관련 문제