2016-10-24 3 views
-4

C 프로그래밍 언어로 파일 I/O 개념을 배우려고합니다. 나는 GNU/리눅스 (Ubuntu 16.04 LTS)을 사용하고 있고 나의 IDE는 eclipse 3.8입니다. fprintf() 메서드를 통해 파일에 쓸 때 파일을 만들지 않거나 파일을 만든 경우에도 파일에 쓸 수 없습니다. 나는 fflush() 또는 setbuf(file_pointer, NULL) 메서드를 사용하여이 문제를 해결하려고 시도했지만 here으로 제안되었지만 여전히 변경되지 않았습니다. 파일의 주소를 잘못 쓰는 것 같아요.우분투에서 fprintf()가 작동하지 않습니다.

#include <stdio.h> 
int main(void){ 
    FILE *file_pointer; 
    file_pointer=fopen("~/.textsfiless/test.txt","w+"); 
    setbuf(file_pointer,NULL); 
    fprintf(file_pointer,"Testing...\n"); 
    fclose(file_pointer); 
    return EXIT_SUCCESS; 
} 

사람이 여기에 무엇이 잘못되었는지 설명 할 수 : 여기

코드인가?

+0

'setbuf (file_pointer, NULL);'파일'fopen' 후 수행해야합니다 ... – LPs

+3

'fopen()'의 성공 여부를 확인하지 않으시겠습니까? –

+4

'fopen' 반환 값을 확인하십시오. 잘못된 파일 경로 인 경우 실패 할 수 있습니다. – LPs

답변

3

fopen()에 대한 통화가 실패 할 가능성이 높습니다. fopen이 제대로 작동하는지 확인하기 위해 프로그램을 점검 할 필요가 없습니다. 이 없을 수 있습니다, 당신은 등, 경로가 잘못된 철자 잘못된 파일 또는 프로세스 권한처럼이 사물의 다양한 때문일 수

정말, 당신은 fopen의 체크한다 반환 값 무슨 일이 있었는지 보려면 :

#include <stdio.h> 
int main(void){ 
    FILE *file_pointer; 
    file_pointer=fopen("~/.textsfiless/test.txt","w+"); 
    if (file_pointer == NULL) { 
     printf("Opening the file failed."); 
     return EXIT_FAILURE; 
    } 
    setbuf(file_pointer,NULL); 
    fprintf(file_pointer,"Testing...\n"); 
    fclose(file_pointer); 
    return EXIT_SUCCESS; 
} 

편집 : 귀하의 의견을 듣고 나서, 경로가 잘못되어 가장 확실한 일이 발생했습니다. 현재 디렉토리에서 프로그램을 실행하고 있고 파일이 현재 디렉토리의 "textfiless"폴더에 있고 파일 이름이 "test.txt"인 경우

과 같이 fopen을 호출합니다. 리눅스에
+0

제가 생각하기에이 질문에서 언급했듯이 제가 사용한 디렉토리는 존재하지 않는 것 같습니다. 하지만 난 항상이 같은 디렉토리를 사용하고 아무런 문제가 없습니다. 여기서 파일 디렉토리가 어떤 것인지 알 수 없습니다. –

+0

@ ErfanKhalaji 나는 그에 대한 기사를 내 대답에 추가했습니다. – Magisch

+0

편집으로 작성했지만 변경 사항이 없습니다. 제 질문에 투표 해주십시오. 나는이 질문에 아무런 이상이 없지만 사람들은 투표를하지 않는다. –

4

file_pointer=fopen("/textsfiless/test.txt","w+"); 
, ~/.textsfiless/test.txt~ 명령 줄에 ~를 사용하는 C 라이브러리 fopen ...에 의해 확장되어 있지 않은, 그것은으로 확장하여 shell (그러나 시작을 사용하여 프로그램에 의해 하지 셸이 execve(2) ...)을 사용자의 home directory에 넣습니다. 확장은 globbing입니다. glob(7)을 읽으십시오. 디렉토리가 ~ 인 것은 거의 없습니다.

당신은 (실패했다 가능성이 높다) fopen이 실패하면

Advanced Linux Programming 그래서 당신이 확인해야 읽어야합니다. 홈 디렉토리에 파일을 가져 오려면 getenv(3)"HOME" (또는 아마도 getpwuid(3) & getuid(2) ...)과 함께 사용하는 것이 좋습니다.

environ(7)은 아마도 더 나은 코드가있을 수 있습니다 참조 : 등등

char*homedir = getenv("HOME"); 
if (!homedir) { perror("getenv HOME"); exit(EXIT_FAILURE); }; 
char pathbuf[512]; /// or perhaps PATH_MAX instead of 512 
snprintf(pathbuf, sizeof(pathbuf), 
      "%s/.textsfiless/test.txt", homedir); 
FILE *file_pointer = fopen(pathbuf, "r"); 
if (!file_pointer) { perror(pathbuf); exit(EXIT_FAILURE); }; 

하고 있습니다.

대부분의 오류에 대해 확인해야합니다. C standard library (& POSIX) 기능. perror(3) 함수는 stderr에 사용자에게 오류를보고하는 데 유용합니다.

(pedantically, 우리는 심지어 sizeof(pathbuf) 이하의 길이를 반환 snprintf(3)이를 테스트하거나 사용 및 테스트 대신에 실패 asprintf(3)에해야한다, 나는 독자에게 연습으로 그 테스트를 떠나)보다 일반적으로

, 읽은 사용중인 모든 외부 기능 중 documentation입니다.

주의 : 코드에는 undefined behavior에주의해야합니다 (예 : 코드에 fprintf ~ NULL 스트림). 모든 경고 & 디버그 정보 (그래서 gcc -Wall -g)로 코드를 컴파일하고 gdb 디버거를 사용하십시오. What every C programmer should know about undefined behavior.

BTW를 읽고 strace(1)을보고 원본 (결함이있는) 프로그램에서 사용해보십시오. system calls에 대해 많이 배우게됩니다.

+1

나는 질문을 지우고 싶지만 나는 위선적이다. 답변을 삭제하십시오. –

+1

내 대답을 삭제할 이유가 없습니다. 그것은 한 번 이상 upvoted되었습니다, 그래서 그렇게 나쁜 것은 아닙니다 .... –

관련 문제