ko ko ko en en en ko ko cs zh ko ko ko ko ko ko ko ko ko it ko ko zh ko ko en ko ko ko ko ko ko ko ko ko ru ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko en ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko fr ko ko ko ko fr ko ko ko en en ko en zh en en
C 언어 코딩 도장: 71.4 제한된 버퍼로 파일 전체를 읽기
◀ 71.3 파일을 부분적으로 읽고 쓰기71.5 퀴즈 ▶︎
파일의 크기가 작다면 파일 크기만큼 버퍼를 생성해서 한꺼번에 읽으면 됩니다. 하지만 파일의 크기가 엄청 클 때는 파일 크기만큼 큰 버퍼를 생성하기에는 어려움이 있습니다. 이번에는 파일의 끝인지 검사하는 함수 feof와 부분적으로 파일을 읽는 방법을 이용해서 제한된 버퍼로 파일 전체를 읽어보겠습니다.
feof 함수는 현재 파일 포인터가 파일의 끝인지 검사합니다(stdio.h 헤더 파일에 선언되어 있습니다).
파일의 끝이면 1, 끝이 아니면 0을 반환
다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
이번 예제에서는 크기가 큰 파일을 연다고 가정하겠습니다. 먼저 버퍼 크기를 5바이트로 만들어주는데 문자열을 읽어서 출력할 것이므로 문자열 4바이트, NULL 1바이트를 더해서 5바이트입니다(실제로는 메가바이트 단위로 버퍼를 만들면 됩니다).
fopen 함수를 사용하여 파일을 읽기 모드(r)로 엽니다.
while 반복문에 조건식으로 feof(fp) == 0을 지정하여 파일 포인터가 파일의 끝이 아닐 때 계속 반복합니다. fread 함수로 파일을 읽을 때는 buffer를 선언한 자료형이 char이므로 sizeof(char)를 지정하여 1바이트 크기로 4번 읽습니다. 이렇게 하면 fread로 파일을 읽었을 때 읽은 크기만큼 반환값이 나오게 되므로 파일을 읽은 전체 크기를 구할 수 있습니다.
fread로 파일을 읽었다면 count에 읽은 크기를 저장해두고 printf로 buffer의 내용을 출력합니다. 출력이 끝났으면 memset함수로 buffer의 내용을 0으로 초기화한 뒤 total에 읽은 크기 count를 누적합니다.
이제 파일을 4바이트씩 쪼개서 읽은 뒤 부분 부분 내용을 출력하면 전체 문자열이 출력됩니다(앞에서 "Hello, world!" 중간에 "abcd"를 썼으므로 "Helabcdworld!"가 나옵니다).
hello.txt의 크기가 13바이트이므로 파일을 읽은 전체 크기는 13이 출력됩니다.
마지막으로 파일 읽기가 끝났다면 fclose 함수로 파일을 닫아줍니다.
지금까지 제한된 버퍼로 파일을 읽은 과정을 그림으로 표현하면 다음과 같습니다. 즉, fread로 4바이트씩 읽으면서 계속 순방향으로 이동하고, feof(fp)의 반환값이 1이 되면 멈추는 방식입니다.
▼ 그림 71‑9 제한된 버퍼로 파일 전체를 읽기
fread(buffer, sizeof(char), 4, fp);에서 첫 번째, 두 번째, 세 번째 호출에서는 4바이트를 읽고 4를 반환하지만, 마지막에는 남은 데이터가 1바이트 밖에 없으므로 1바이트만 읽고 1을 반환합니다.
참고 | feof 함수와 EOF
feof 함수는 현재 파일 포인터의 위치가 파일의 끝이면 1, 파일의 끝이 아니면 0을 반환하므로 -1인 EOF와는 상관이 없습니다. EOF는 scanf, fscanf 등의 함수에서 값을 읽을 수 없는 상태일 때 반환됩니다.
지금까지 파일 포인터에 대해 배웠는데 눈에 보이지 않는 파일의 내부를 왔다 갔다 해서 이해하기가 쉽지 않았을 겁니다. 아직은 개념을 완벽히 이해하지 않아도 되며 함수 사용 방법만 외워서 사용해도 됩니다. 여기서 파일 포인터를 이동시킬 때는 fseek 함수를 사용한다는 점, fread, fwrite, fputs, fgets 등의 함수는 동작한 후에 파일 포인터가 순방향으로 이동한다는 점만 기억하면 됩니다.
◀ 71.3 파일을 부분적으로 읽고 쓰기71.5 퀴즈 ▶︎
C 언어 코딩 도장 생략
C 언어 코딩 도장
도서 구매 바로 가기
C 언어 코딩 도장
Unit 1. 소프트웨어 교육과 C 언어
Unit 2. Visual Studio 설치하기
Unit 3. Hello, world!로 시작하기
Unit 4. 기본 문법 알아보기
Unit 5. 변수 만들기
Unit 6. 디버거 사용하기
Unit 7. 정수 자료형 사용하기
Unit 8. 실수 자료형 사용하기
Unit 9. 문자 자료형 사용하기
Unit 10. 상수 사용하기
Unit 11. 입력 값을 변수에 저장하기
Unit 12. 덧셈, 뺄셈하기
Unit 13. 증가, 감소 연산자 사용하기
Unit 14. 곱셈, 나눗셈하기
Unit 15. 나머지 연산하기
Unit 16. 자료형의 확장과 축소 알아보기
Unit 17. if 조건문으로 특정 조건일 때 코드 실행하기
Unit 18. else를 사용하여 두 방향으로 분기하기
Unit 19. else if를 사용하여 여러 방향으로 분기하기
Unit 20. 비교 연산자와 삼항 연산자 사용하기
Unit 21. 논리 연산자 사용하기
Unit 22. 불 자료형 사용하기
Unit 23. 비트 연산자 사용하기
Unit 24. 비트 연산자 응용하기
Unit 25. 연산자 우선순위 알아보기
Unit 26. switch 분기문으로 다양한 조건 처리하기
Unit 27. for 반복문으로 Hello, world! 100번 출력하기
Unit 28. while 반복문으로 Hello, world! 100번 출력하기
Unit 29. do while 반복문으로 최소 한 번은 실행하기
Unit 30. break, continue로 반복문 제어하기
Unit 31. 계단식으로 별 출력하기
Unit 32. goto로 프로그램의 흐름을 원하는 대로 바꾸기
Unit 34. 포인터 사용하기
Unit 35. 메모리 사용하기
Unit 36. 배열 사용하기
Unit 37. 2차원 배열 사용하기
Unit 38. 포인터와 배열 응용하기
Unit 39. 문자열 사용하기
Unit 40. 입력 값을 문자열에 저장하기
Unit 41. 문자열의 길이를 구하고 비교하기
Unit 42. 문자열을 복사하고 붙이기
Unit 43. 문자열 만들기
Unit 44. 문자열 검색하기
Unit 45. 문자열 자르기
Unit 46. 문자열과 숫자를 서로 변환하기
Unit 47. 회문 판별과 N-gram 만들기
Unit 48. 구조체 사용하기
Unit 49. 구조체 포인터 사용하기
Unit 50. 두 점 사이의 거리 구하기
Unit 51. 구조체 멤버 정렬 사용하기
Unit 52. 구조체와 메모리 활용하기
Unit 53. 구조체 배열 사용하기
Unit 54. 공용체 사용하기
Unit 55. 구조체와 공용체 활용하기
Unit 56. 구조체 비트 필드 사용하기
Unit 57. 열거형 사용하기
Unit 58. 자료형 변환하기
Unit 59. 포인터 연산 사용하기
Unit 60. 함수 사용하기
Unit 61. 함수에서 반환값 사용하기
Unit 62. 함수에서 매개변수 사용하기
Unit 63. 함수에서 포인터 매개변수 사용하기
Unit 64. 함수에서 배열 매개변수 사용하기
Unit 65. 함수에서 구조체 매개변수 사용하기
Unit 66. 함수에서 가변 인자 사용하기
Unit 67. 함수에서 재귀호출 사용하기
Unit 68. 함수 포인터 사용하기
Unit 69. 함수 포인터 활용하기
Unit 70. 파일에서 문자열을 읽고 쓰기
Unit 71. 파일 포인터 활용하기
71.1 파일 크기 구하기
71.2 파일 크기만큼 파일 읽기
71.3 파일을 부분적으로 읽고 쓰기
71.4 제한된 버퍼로 파일 전체를 읽기
71.6 연습문제: 파일 크기만큼 파일 읽기
71.7 연습문제: 파일을 부분적으로 읽기
71.8 연습문제: 텍스트 파일 복사 프로그램 만들기
71.9 심사문제: 파일 크기만큼 파일 읽기
71.10 심사문제: 파일을 부분적으로 읽기
71.11 심사문제: 파일을 읽은 뒤 거꾸로 저장하기
Unit 72. 파일에서 구조체를 읽고 쓰기
Unit 73. 배열 정렬하기
Unit 74. 연결 리스트 구현하기
Unit 75. 매크로 사용하기
Unit 76. 조건부 컴파일과 파일 포함 사용하기
Unit 77. 여러 소스 파일 사용하기
Unit 78. 전역 변수 사용하기
Unit 79. 기억 부류 지정자 사용하기
Unit 80. 실행 파일 옵션 사용하기
Unit 81. 실전예제: 비트맵 파일을 아스키 아트로 변환하기
Unit 82. 실전 예제: 파일 아카이브 구현하기
Unit 83. 실전 예제: JSON 파일 읽고 쓰기
Unit 84. 실전 예제: GitHub의 소스 코드 사용하기
- 이 사이트에 실린 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 (주)도서출판 길벗과 지은이에게 있습니다.
- 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.
- 책의 내용을 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다.
- 링크, SNS 공유는 허용합니다.
서울시 마포구 서교동 월드컵로 10길 56 (서울시 마포구 서교동 467-9)
Copyright © 2016-2021 Coding Dojang