👨‍💻Programming/C언어

(C언어) 파일의 관련된 함수

코너(Corner) 2020. 10. 30.
반응형

1. fread함수

fread


 

1
2
 
#include <stdio.h> // C++ 에서는 
<cstdio> size_t fread(void* ptr, size_t size, size_t count, FILE* stream);
cs

 

스트림에서 데이터 블록을 읽어온다.

스트림에서 count 개의 원소를 가지는 배열을 읽어온다.

이 때, 각 원소의 크기는 size 바이트 이고 ptr 이 가리키는 배열에 넣게 된다.

(이 때, countsizeptr 은 모두 fread 의 각각의 인자들을 의미한다)

스트림의 위치 표시자는 읽어들인 바이트 수 만큼 증가하게 된다.전체 읽어들인 바이트 수는 만일 성공적일 경우,

(size * count) 가 된다.

 

 

 


인자 

 


size
읽어들일 원소의 크기로 단위는 바이트 이다. 예를 들어 size 가 4 이면 하나의 원소의 크기는 4 바이트 임을 일컫는다.size * count 의 크기를 가지는 배열을 가리키는 포인터ptr

count읽어들일 원소들의 개수로 각 원소의 크기는 size 바이트 이다.

stream데이터를 입력받을 스트림의 FILE 객체를 가리키는 포인터

 

 


리턴값


 참고로
size_t 형은 정수 타입이다. 만일 읽어들인 개수가 count 인자에서 지정한 것과 다르거나,

End OF File 에 도달하였다면 오류가 발생한다. 이 때, 여러분은 ferror함수나 feof함수를 이용하여

어떠한 오류인지를 파악할 수 있다.

만일 성공적으로 지정한 원소의 개수 만큼 읽어들였다면 읽어들인 원소의 개수가 size_t 형으로 리턴된다.

 


2. fwriter함수

fwrite


1
2
3
#include <stdio.h> // C++ 에서는 
// <cstdio> size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);
 
 
 
cs

스트림에 데이터 블록을 쓴다.

스트림에 count 개의 원소를 가지는 배열을 쓴다. 각각의 원소는 size 바이트이고,

그 배열은 ptr 이 가리키는 것이다.

따라서, 전체 스트림에 써지는 바이트 수는 size * count 가 된다.

전체 스트림에 써지는 바이트 수 만큼 위치 지정자가 증가하게 된다.

 

인자

ptr

스트림에 쓰여질 배열을 가리키는 포인터.

size

그 배열의 각각의 원소의 크기

count

그 배열의 원소의 수 이다. 이 때, 각 원소의 크기는 size 바이트 이다.

stream

내용을 쓸 스트림을 가리키는 FILE 포인터

 

 


리턴값


이는 정수형이다. 만일, 쓰여진 바이트 수와
count 의 값이 다르다면 오류가 발생되게 된다.스트림에 성공적으로 써진 전체 원소의 개수는 size_t 형으로 리턴된다.

 

 


fseek


#include <stdio.h> // C++ 에서는 <cstdio> int fseek(FILE* stream, long int offset, int origin);

스트림 위치 지정자 (position indicator) 의 위치를 조정한다.

origin 인자로 전달된 위치로 부터 offset 인자로 전달된 만큼 더한 위치로 위치 지정자를 설정한다.이 함수를 호출한 이후에는 파일 끝 지정자 (End of File indicator) 가 초기화 되고, 이전에 만일 ungetc함수를 호출하였다면 이로 인한 효과는 모두 사라지게 된다.

한가지 명심해야 할 점은, 만일 텍스트 파일에 fseek 함수를 사용할 때, offset 값으로 0 이나 같은 파일에 ftell 함수를 사용했을 때 반환된 값 이외의 것들을 사용하는 것은 의도하지 않은 결과를 초래할 수 있으니 조심해야 한다.

fseek 함수는 또한 스트림이 읽기 및 쓰기 형식으로 열려있을 때, 이 함수를 호출함을 통해 읽기 - 쓰기 모드를 전환할 수 있다. (자세한 내용은 fopen함수를 참조하기 바란다)

 

 


인자


stream

작업을 수행할 스트림의 FILE 객체를 가리키는 포인터

offset

orgin 으로 부터 얼마나 떨어진 곳에 설정할 지에 대한 값

origin

오프셋이 더해지는 위치로, <stdio.h> 에 정의된 다음과 같은 매크로 상수들을 이용한다.

상수

설명

SEEK_SET

파일의 시작

SEEK_CUR

현재 파일 포인터의 위치

SEEK_END

파일의 끝

 

 

 

리턴값

만일 성공하였으면 0 을 리턴한다. 그렇지 않다면 0 이 아닌 값을 리턴한다.

 

실행 예제

/* example.txt 에 "This is an apple" 을 쓴 뒤에 다시 fseek 함수를 이용하여 n 부터 sam 으로 바꾼다.
즉, example.txt 에는 "This is an sample" 이 들어가게 된다. 이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/fseek/ 에서 가져왔습니다. */

1
2
3
4
5
6
7
8
9
10
#include <stdio.h> 
int main() { 
 
FILE* pFile; 
 
pFile = fopen("example.txt""w"); 
 
fputs("This is an apple.", pFile); 
 
fseek(pFile, 9, SEEK_SET); fputs(" sam", pFile); fclose(pFile); return 0; }
cs

 

 

 

 

ftell


#include <stdio.h> // C++ 에서는 <cstdio> long int

 

ftell(FILE* stream);

스트림의 위치 지정자의 현재 위치를 구한다.

이진(binary) 스트림의 경우, 리턴된 값이 파일의 시작 부분에서 부터 현재 위치까지의 바이트 수를 말한다.텍스트 스트림의 경우 위의 경우와는 조금 다르게,파일의 시작 부분으로 부터 현재 위치 까지의 바이트 수라고 단정짓기 힘들다.

(이진 스트림과 텍스트 스트림에 대해 자세히 알고 싶다면 stdio.h를 참조) 하지만, 이 리턴된 값을 가지고 fseek함수를 이용하면 현재의 위치로 파일 위치 포인터를 설정할 수 있다.

 

 

 

인자

stream

작업을 수행할 스트림의 FILE 객체를 가리키는 포인터

 

 

리턴값

성공적으로 수행하였다면 현재의 위치 포인터가 가진 값이 리턴된다.만일 오류가 발생하였다면 NULL 이 리턴되고, 전역 변수 errno 의 값은 양수로 설정된다. perror함수를 통해 errno 의 값을 해석할 수 있다.

 

실행 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 파일 전체의 크기를 읽어온다. pFile 을 파일 끝으로 선택한 뒤, 
ftell 함수를 통해서 파일 처음 부터 pFile 까지, 
즉 파일 처음 부터 끝 까지의 바이트 수를 계산한다.
 이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/ftell/ 에서 가져왔습니다. */ 
#include <stdio.h> 
int main() { 
FILE* pFile; 
long size
pFile = fopen("myfile.txt""rb"); 
if (pFile == NULL
perror("Error opening file"); 
else { 
fseek(pFile, 0, SEEK_END); 
size = ftell(pFile); 
fclose(pFile); 
printf("Size of myfile.txt: %ld bytes.\n"size); 
return 0
}
 
cs

 

 

 

 

 

 

C 언어 레퍼런스 - ftell 함수

아직 C 언어와 친숙하지 않다면, 씹어먹는 C 언어 강좌 를 보는 것이 어떻까요? ftell #include <stdio.h> // C++ 에서는 <cstdio> long int ftell (FILE * stream); 스트림의 위치 지정자의 현재 위치를 구한다. 이진(binary) 스트림의 경우, 리턴된 값이 파일의 시작 부분에서 부터 현재 위치까지의 바이트 수를 말한다.텍스트 스트림의 경우 위의 경우와는 조금 다르게,파일의 시작 부분으로 부터 현재 위치 까지의 바이트 수라고 단정짓기 힘들다. (이진 스트림과 텍스트 스트림에 대...

modoocode.com

fread(*buffer,element size, element count, file stream);

*buffer

읽기를 한 내용을 저장할 메모리의 포인터를 입력합니다.

element size

한번에 읽어올 크기

element count

읽어올 횟수

file stream

파일포인터

fwrite(*buffer,element size, element count, file stream);

*buffer

쓰기를 할 내용이 저장된 메모리의 포인터를 입력합니다.

element size

한번에 쓰기할 크기

element count

쓰기 횟수

file stream

파일포인터

fseek : binary 파일을(혹은 그냥 파일을) 원하는 위치에서부터 읽을 수 있게 해주는 함수.

구조 : fseek("파일 포인터", "이동할 바이트 수", "옵션");

"이동할 바이트 수" 는 long int 로 주어야 한다고 검색 결과들이 말해주고 있으나,

그냥 int 로 정의된 값을 집어 넣어도 기본적인 단계에서는 오류가 없는듯 하다.

"옵션" 은 파일의 처음부터 몇칸 이동해서 읽은건지, 마지막부터 몇칸 이동해서 읽을건지,

혹은 지금 파일 포인터가 가리키는 위치에서 몇칸 이동해서 읽을건지를 지정해주는 것.

SEEK_SET / SEEK_END / SEEK_CUR 로 각각 지정해주면 된다.

반응형

댓글