2014-10-03 3 views
5

포럼을 검색 했으므로이 문제에 대한 답을 찾을 수 없습니다. 공통적 인 것으로 보이지만 언급 된 수정 사항 중 어느 것도 적용 가능하지 않습니다.fopen이 C에서 잘못된 인수를 반환합니다.

는이 파일을 열기위한 내 코드입니다 :

#include <stdio.h> 
#include <string.h> 

void main() { 
    FILE *input; 
    char path[200]; 

    printf("Enter the full file path and file name in the following format:" 
     "\nC:\\Users\\Username\\etc......\\filename.extension\n"); 
    fgets(path, 200, stdin); 
    printf("%s",path); 
    input=fopen(path,"r"); 
    if (input==NULL) { 
     perror("The following errors were encountered"); 
     return(-1); 
    } 
} 

printf(%s,path)이 제대로 나는 열려는 파일의 경로와 이름을 표시하지만 FOPEN 항상 잘못된 인수를 반환합니다. 나는 또한 fopen에서 경로에 포인터를 사용하여 시도했지만,이 항상 프로그램이 충돌합니다.

+9

'path'에 후행 줄 바꿈 문자가 포함되어 있기 때문입니다 ... – isedev

+0

BTW :'void main'이 좋지 않습니다. 대신'int main'을 사용하십시오. 또한'return'은 함수가 아니므로 인수를 둘러싼 괄호가 필요합니다. – Deduplicator

+5

부가 메모 : main이 void로 선언되면 값 '-1'이 반환됩니다. 그러지 마. main을 int로 선언하고 모든 코드 경로에서 무엇인가를 반환합니다. 그것은 심각한 오류가 아니지만 나쁜 스타일입니다. – jpw

답변

6

으로 path이 표시되고 있습니다. \nfgets에 의해 유효한 문자로 간주됩니다. 수동으로 제거해야합니다.

fgets(path, 200, stdin); 
path[strlen(path) - 1] = '\0'; 
+0

충분하지 않을 수 있습니다. 'fgets'는'\ r \ n '로 끝나는 줄을 반환 할 수도 있지만 (어쨌든 오래된 C 라이브러리는 그렇게 함) 사용자가 실수로 후행 공백을 입력 할 수 있습니다. – zwol

+1

'path [strlen (path) - 1]' –

+1

@Zack 또는 실패를 나타 내기 위해'NULL'을 반환 할 수 있습니다. – Deduplicator

5

귀하의 문제는 아마fgets 있음이 그것을 반환하기 전에 입력 줄에서 후행 '\n'을 제거하지 않습니다이다. fopen이 쾌활하게 이름에 '\n'이 포함 된 파일을 열려고 시도하지만 (Windows에서 사용하는 코드에서 알 수 있듯이) 운영 체제가 파일 이름에 해당 문자를 포함 할 수 없기 때문에 "잘못된 인수가 표시됩니다 " 메시지. 커널이 파일 이름에 대한 제약 조건을 훨씬 적게 부과하는 유닉스 형 시스템에서는 "No such file or directory"를 얻게됩니다. 이것이이 질문에 대한 이전 답변을 찾지 못한 이유 일 수 있습니다. 나는 전에 변주를 보았다는 것을 안다.

이 시도 :

... 
fgets(path, 200, stdin); 
char *p = path + strlen(path) - 1; 
while (isspace(*p)) p--; 
*(p+1) = '\0'; 
printf("%s\n", path); 
input = fopen(path, "r"); 
... 

당신은 isspace에 대한 #include <ctype.h>가 필요합니다.

관련 문제