fwrite는 어떤 일을 하는 함수일까요? block의 데이터를 stream에 쓰는 함수입니다. 함수 원형은 아래와 같습니다.

 

 1번째 인자인 ptr은 쓸 데이터를 의미합니다. void형 포인터인게 눈에 띄는데요. 써야 할 데이터가 moo를 가리키는 포인터인지, student를 가리키는 포인터인지 모르거든요. 2번째 인자인 size는 몇 byte를 쓸 거냐를 나타냅니다. count는 몇 번이나 쓸 지를, 4번째는 파일 포인터를 의미합니다.

 

 예제를 보면서 차근 차근 설명해 보도록 하겠습니다.


 프로그램 1을 보겠습니다. 이걸 보기 전에, 1.txt를 먼저 생성해 보겠습니다.

 

 일단 1.txt는 빈 파일입니다. 이는 ls 명령어를 통해서 봐도 알 수 있고, cat 1.txt | wc 명령어를 입력해도 알 수 있습니다.

 

 

 빈 파일의 단어 갯수, 글자 갯수는 0입니다. 1.txt는 빈 파일임을 알 수 있습니다. 이제 프로그램 1을 보겠습니다.

 

 

 먼저 st 구조체가 있습니다. name과 age를 저장할 수 있는 레코드를 파일에 넣을 듯 싶군요. write_file하고, read_file_all이 있는데요. 이 중 2번째 함수인 read_file_all은 파일에 있는 레코드 전체를 읽어내는 함수입니다.

 

 

 먼저, 1.txt를 a+ 모드로 연 다음에 write_file 함수를 4번 호출합니다. 그리고, read_file_all을 호출한 다음에 파일을 닫습니다. 생각보다 복잡하지 않아 보입니다.

 

 

 그러면, write_file에는 뭐가 들어가야 할까요? 일단, 레코드를 쓰긴 써야 합니다. 이 레코드가 st일 뿐입니다.

 

 

 우리는 이 레코드 하나를 파일에 써야 합니다. 써야 하는 대상체가 무엇인가요? 레코드 s입니다. 크기는 얼마인가요? 대상 레코드의 크기는 sizeof 연산자를 이용해서 구할 수 있습니다. sizeof(st)로 구하면 되겠네요. 3번째 인자는 1을, 4번째 인자는 파일 포인터를 넣어주시면 되겠습니다.

 

 

 다음에 read_file_all 함수를 보겠습니다. 여기에서는 rewind 함수를 호출하였는데요. 파일 지시자를 맨 처음 위치로 돌려놓는 함수입니다. 그러면 지시자는 파일의 맨 처음 위치를 가리킬 겁니다. 단, seekable한 것이라면요. fread의 리턴값을 가지고, while문을 돌리는 것을 알 수 있는데요.

 

 fread는 읽은 바이트 수를 리턴합니다. 파일의 끝에 도달했다면, 읽을 수 없을 겁니다.

 

 


 이제 프로그램의 실행 결과를 보도록 하겠습니다.

 

 

 문제의 프로그램을 실행하면, cho 12, ga 56, hui 5, cky 5라는 값이 출력되는 것을 알 수 있습니다.  이 결과에 대해서 의문이 드실 겁니다. cho 12라는 결과가 쓰여지고 난 후에, ga 56이라는 값이 덮어씌워지지 않을까? 링크에 있는 아래 문구를 보면 다음과 같은 설명이 있습니다.

 

 이 문구를 해석해 보면, fwrite를 호출하면 파일에 쓴 byte만큼 파일 지시자가 이동합니다. 즉, 레코드 하나를 파일에 썼다면, 레코드 하나가 차지하는 byte만큼 파일 지시자가 이동하기 때문에, cho 12라는 결과가 쓰여지고 난 후에, 지시자를 이동시키지 않으면, cho 12가 ga 56으로 overwrite가 되지 않습니다.

 

 

 1.txt의 단어 수를 출력해 보면 96이 나옵니다. byte를 봐도 96이 나오는 거 같은데 이것은 레코드 4개를 연달아서 썼다는 사실과 관련이 깊어 보입니다. 프로그램 2를 간단하게 작성해 보겠습니다.

 

 

 그러면, sizeof(st)를 촐력해 보면 될 겁니다. 이것이 레코드 하나가 차지하는 크기이기 때문입니다.

 

 

 프로그램 2을 컴파일해서 실행시켜 보면 24가 나옵니다. 24에 4를 곱한 값은 96입니다.