위와같이 w옵션을 주어 fopen함수 사용시 파일명에 해당하는 파일이 없다면 새로 생성하여 안에 데이터를 입력한다.
소스파일에서 설명했듯이 리눅스에서 한글은 2~3바이트로 불규칙 적이다. 실행화면을 보면 2개의 문자를 요청했으며 하나는 정상적으로 출력이 완료되었지만 다른 하나는 비정상적인 출력이 되는것을 알 수 있다.이것은 출력하려는 데이터의 크기가 정확하지 않아서 발생하는 문제이다.
fopen함수에서 wb옵션을 준것은 바이너리 모드로 열어서 쓰겠다는 의미이다. 바이너리 모드란 숫자 4를 넣을때 아스키코드값이 들어가는 것이아니라 이진데이터 4가 들어가는 것을 의미합니다. 저장된 파일을 열어보면 알수 없는 형태로 저장되는것을 확인할 수 있습니다.
rb는 바이너리모드로 열어서 읽는 다는 옵션이다.
바이너리 모드로 열어서 저장한데이터는 바이너리모드로 열어서 읽으면 저장한 그대로 출력이 가능하다.
위 소스코드로 입력한 결과이다. wt는 텍스트 모드로 열어서 쓴다는 의미이다. 데이터를 아스키코드값으로 저장한다.
날짜는 바이너리모드로 입력하고 다른 데이터들은 텍스트 모드로 입력하는 파일이다.
바이너리 모드로 된 데이터는 바이너리모드로 읽고 텍스트모드로 저장된 데이터는 텍스트 모드로 읽으면된다.
바이너리모드 관련함수는 fread와 fwrite이고 텍스트모드는 fgets, fputs 등등이다.
날짜와 지역 오전오후만 입력해서 해당 데이터를 출력하는 것이다. 검색하는 데이터만 읽어야한다고 생각을 해서 문제해결에 어려움이 있었다. 그냥 데이터를 다읽어서 입력한 데이터와 비교하여 같은 부분만 출력하는 형태로 문제를 풀었다.
파일을 바이너리모드로 열고 텍스트 문자를 입력하고 바이너리모드로 열어서 데이터를 읽는 것이다. 문자열을 읽어서 출력하는 부분에서 fgets를 사용하면 편했겠지만 문제에서 요구하는것은 fread를 사용하는 것이다. fread를 사용할때는 개행문자('\n')까지만 읽는것이 아니라서 해당 문자열일때 break를 걸어주는 방식으로 문제를 풀었다.
파일을 복사하는 프로그램이다. 파일이름을 가져올때는 fgets를 사용해서는 안된다. 개행문자('\n')까지 파일명으로 인식하기 때문이다.
파일데이터를 복사할 때는 바이너리모드로 여는것이 좋을 듯 하다. 텍스트 모드로 파일을 열면 '\n'가 '\r\n'으로 변경되기 때문이다.
fgetc는 한글자씩 읽기 때문에 해당 프로그램의 성능은 좋지 않다.
fread와 fwrite를 통해 데이터를 복사하는 프로그램이다. feof함수는 파일의 끝을 알려주는 함수가아니라, 더이상 읽을 데이터가 없는데도 읽을려고 할때 feof는 0이아닌값을 반환한다. 즉 파일을 읽는 함수인 fread이후에 배치되어야한다.
'Programming > C' 카테고리의 다른 글
프로젝트 2 - 가위바위보 게임 만들기 (0) | 2019.12.13 |
---|---|
프로젝트 1 - 전화번호부 만들기 (0) | 2019.11.16 |
C헤더파일, 파일 분할 연습 (0) | 2019.10.19 |
C구조체 연습문제 (0) | 2019.09.08 |
C 메모리 동적할당 연습 (0) | 2019.08.31 |