C 파일 읽기 및 쓰기


이전 장에서는 C 언어 처리를 위한 표준 입출력 장치에 대해 설명했습니다. 이 장에서는 C 프로그래머가 텍스트 또는 바이너리 파일을 생성하고 열고 닫는 방법을 소개합니다.

텍스트 파일이든 바이너리 파일이든 파일은 일련의 바이트를 나타냅니다. C 언어는 액세스를 위한 최상위 기능을 제공할 뿐만 아니라 저장 장치의 파일을 처리하기 위한 하위 수준(OS) 호출도 제공합니다. 이 장에서는 파일 관리의 중요한 요구 사항을 설명합니다.

파일 열기

fopen( ) 함수를 사용하여 새 파일을 만들거나 기존 파일을 열 수 있습니다. 이 호출은 FILE 유형의 개체를 초기화합니다. 흐름을 제어하는 ​​데 필요한 정보입니다. 다음은 이 함수 호출의 프로토타입입니다.

FILE *fopen( const char * filename, const char * mode );
여기서

filename

은 파일 이름을 지정하는 데 사용되는 문자열이며 액세스 모드 mode의 값은 다음 값 중 하나일 수 있습니다.

mode rwar+w+a+

바이너리 파일을 처리하는 경우 위의 액세스 모드 대신 다음 액세스 모드를 사용해야 합니다.

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

파일 닫기

;

파일을 닫으려면 fclose() 함수를 사용하세요. 함수의 프로토타입은 다음과 같습니다.

 int fclose( FILE *fp );

fclose( ) 함수는 파일이 성공적으로 닫히면 0을 반환하고, 파일을 닫는 동안 오류가 발생하면 EOF를 반환합니다. 이 함수는 실제로 버퍼의 데이터를 지우고, 파일을 닫고, 파일에 사용된 모든 메모리를 해제합니다. EOF는 헤더 파일 stdio.h에 ​​정의된 상수입니다.

C 표준 라이브러리는 파일을 문자 단위로 또는 고정 길이 문자열로 읽고 쓸 수 있는 다양한 기능을 제공합니다.

파일에 쓰기

다음은 스트림에 문자를 쓰는 가장 간단한 함수입니다.

int fputc( int c, FILE *fp );

Function fputc() 매개변수 c의 문자 값을 fp가 가리키는 출력 스트림에 씁니다. 쓰기가 성공하면 작성된 문자를 반환하고, 오류가 발생하면 EOF를 반환합니다. 다음 함수를 사용하여 스트림에 null로 끝나는 문자열을 쓸 수 있습니다.

int fputs( const char *s, FILE *fp );

함수 fputs() fp가 가리키는 출력 스트림에 문자열 s을 씁니다. 쓰기가 성공하면 음수가 아닌 값을 반환하고, 오류가 발생하면 EOF를 반환합니다. int fprintf(FILE *fp,const char *format, ...) 함수를 사용하여 파일에 문자열을 쓸 수도 있습니다. 아래 예를 시도해 보세요.

참고: 사용 가능한 /tmp 디렉토리가 있는지 확인하세요. 디렉토리가 없으면 먼저 컴퓨터에서 디렉토리를 만들어야 합니다.

#include <stdio.h>main(){
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);}

위 코드를 컴파일하고 실행하면 /tmp 디렉토리에 새로운 파일 test.txt을 생성하고 두 가지 다른 함수를 사용하여 두 줄을 작성합니다. 다음으로 이 파일을 읽어보겠습니다.

파일 읽기

다음은 파일에서 단일 문자를 읽는 가장 간단한 함수입니다:

int fgetc( FILE * fp );

fgetc() 이 함수는 fp가 가리키는 입력 파일에서 문자를 읽습니다. 반환 값은 읽은 문자이거나 오류가 발생한 경우 EOF입니다. 다음 함수를 사용하면 스트림에서 문자열을 읽을 수 있습니다.

char *fgets( char *buf, int n, FILE *fp );

Function fgets() fp가 가리키는 입력 스트림에서 n - 1 문자를 읽습니다. 읽은 문자열을 버퍼 buf에 복사하고 끝에 null 문자를 추가하여 문자열을 종료합니다.

이 함수가 마지막 문자를 읽기 전에 개행 문자 'n' 또는 파일 끝 EOF를 발견하면 개행 문자를 포함하여 읽은 문자만 반환됩니다. int fscanf(FILE *fp, const char *format, ...) 함수를 사용하여 파일에서 문자열을 읽을 수도 있지만 첫 번째 공백 문자를 만나면 읽기가 중지됩니다.

#include <stdio.h>main(){
   FILE *fp;   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);}

위 코드를 컴파일하고 실행하면 이전 섹션에서 생성된 파일을 읽어서 다음과 같은 결과가 생성됩니다.

1 : This2: is testing for fprintf...3: This is testing for fputs...

첫째, fscanf() 메소드는 This만 읽습니다. 왜냐하면 그 뒤에 공백이 있기 때문입니다. 둘째, fgets()를 호출하여 줄 끝까지 나머지 내용을 읽습니다. 마지막으로 fgets()를 호출하여 두 번째 줄을 완전히 읽습니다.

바이너리 I/O 함수

다음 두 함수는 바이너리 입력 및 출력에 사용됩니다.

size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);              size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);

두 함수 모두 저장 블록(보통 배열 또는 구조)을 읽고 쓰는 데 사용됩니다.

설명
기존 텍스트 파일을 열어 파일을 읽을 수 있도록 합니다.
텍스트 파일을 열어 파일에 쓸 수 있습니다. 파일이 없으면 새 파일이 생성됩니다. 여기서 프로그램은 파일의 시작 부분부터 씁니다.
텍스트 파일을 열고 추가 모드로 파일에 씁니다. 파일이 없으면 새 파일이 생성됩니다. 여기서 프로그램은 기존 파일 콘텐츠에 콘텐츠를 추가합니다.
텍스트 파일을 열어 파일을 읽고 쓸 수 있습니다.
파일을 읽고 쓸 수 있는 텍스트 파일을 엽니다. 파일이 이미 있으면 파일 길이가 0으로 잘리고, 파일이 없으면 새 파일이 생성됩니다.
텍스트 파일을 열어 파일을 읽고 쓸 수 있습니다. 파일이 없으면 새 파일이 생성됩니다. 읽기는 파일의 처음부터 시작되고 쓰기는 추가 모드에서만 시작됩니다.