[C / C ++] C 언어로 파일을 조작하는 방법

C 언어로 파일을 조작하는 방법에는 여러 가지가 있습니다.

먼저 몇 가지 개념을 명확히해야합니다.

프로그램 디자인에서 우리는 일반적으로 프로그램 파일과 데이터 파일의 두 가지 종류의 파일에 대해 이야기합니다.

파일 이름 : 파일에는 사용자 식별 및 참조를위한 고유 한 파일 식별자가 있어야합니다. 파일 이름은 파일 경로 + 파일 이름 트렁크 + 파일 접미사의 세 부분으로 구성됩니다.

파일 유형 : 데이터의 구성에 따라 데이터 파일을 텍스트 파일 또는 바이너리 파일이라고합니다. (동일한 크기의 데이터를 저장하는 이유는 이진 파일의 크기가 텍스트 파일보다 작습니다.)

파일 버퍼 : ANSIC 표준은 데이터 파일을 처리하기 위해 "버퍼 파일 시스템"을 사용합니다. 소위 버퍼 파일 시스템은 시스템이 프로그램에서 사용중인 각 파일에 대해 메모리에있는 "파일 버퍼"를 자동으로 여는 것을 의미합니다. . 버퍼의 크기는 C 컴파일 시스템에 의해 결정됩니다.

파일 포인터 : C 언어에서는 파일을 가리키는 포인터 변수를 사용하는데이 포인터를 파일 포인터라고합니다. 파일 포인터가 가리키는 파일에 대해 다양한 작업을 수행 할 수 있습니다. 파일 이름, 파일 상태, 파일의 현재 위치 등 이 정보는 구조 변수에 저장됩니다. 구조 유형은 FILE이라는 시스템에 의해 선언됩니다. 예를 들어 stdio.h 헤더 파일에는 다음과 같은 파일 유형 선언이 있습니다.

struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
    };
typedef struct _iobuf FILE;

이 FILE 구조의 변수는 FILE 포인터를 통해 유지 될 수 있습니다. FILE * 포인터 변수를 만듭니다.

FILE* pf;//文件指针变量

정의 pf는 FILE 유형 데이터를 가리키는 포인터 변수입니다. 연관된 파일은 파일 포인터 변수를 통해 찾을 수 있습니다.

 일부 파일의 기본 작동 기능은 다음과 같습니다.

1. 파일 열기 및 닫기

    읽고 쓰기 전에 파일을 열고 사용이 끝나면 파일을 닫으십시오.

     ANSIC는 fopen 함수가 파일을 여는 데 사용되며 파일을 가리 키도록 FILE * 포인터 변수가 반환되도록 규정합니다. fclose를 눌러 파일을 닫습니다.

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );

    FILE * fopen (const char * filename, const char * mode); 그 기능은 주어진 모드 모드를 사용하여 파일 이름이 가리키는 파일을 여는 것입니다. 파일이 성공적으로 열리면 스트림에 대한 파일 포인터가 반환됩니다. 파일 열기에 실패하면 NULL이 반환되고 오류 코드가 오류에 저장됩니다.

    int fclose (FILE * stream) 은 스트림 스트림을 닫습니다. 모든 버퍼를 플러시합니다. 반환 값 : 스트림이 성공적으로 닫히면 fclose는 0을 반환하고 그렇지 않으면 EOF (-1)를 반환합니다. (스트림이 NULL이고 프로그램을 계속 실행할 수있는 경우 fclose는 오류 번호를 EINVAL로 설정하고 EOF를 반환합니다.)

    위에서 언급 한 개방 방법은 다음과 같습니다.

     파일 사용 모드의 의미 지정한 파일이 존재하지 않는 경우
    "r"(읽기 전용)    : 데이터를 입력하려면 기존 텍스트를 엽니 다. 파일이 없으면 파일에 오류가있는 것입니다.
    "W"(쓰기 전용)  : 데이터를 출력하려면 텍스트 파일을 엽니 다. 파일이 없으면 새 파일을 만듭니다.
    "A"(추가)    : 텍스트 파일 끝에 데이터를 추가합니다. 파일이 없으면 오류가 발생합니다.
    "Rb"(읽기 전용)   : 데이터를 입력하려면 바이너리 파일을 엽니 다. 파일이 없으면 오류가 발생합니다.
    "Wb"(쓰기 전용)  : 데이터를 출력하려면 바이너리 파일을 엽니 다. 파일이 없으면 새 파일을 만듭니다.
    "Ab"(추가)   : 바이너리 파일 끝에 데이터를 추가합니다. 파일이 없으면 오류가 발생합니다.
    "R +"(읽기 및 쓰기)    : 읽기 및 쓰기 용 텍스트 파일을 엽니 다. 파일이 없으면 오류가 발생합니다.
    "W +"(읽기 및 쓰기) : 읽기 및 쓰기를 위해 새 파일을 제안합니다. 파일이 없으면 새 파일을 만듭니다.
    "A +"(읽기 및 쓰기)   : 파일을 열고 파일 끝에서 읽고 씁니다. 파일이 없으면 새 파일을 만듭니다.
    "Rb +"(읽기 및 쓰기) : 읽기 및 쓰기 용 바이너리 파일을 엽니 다. 파일이 없으면 오류가 발생합니다.
    "Wb +"(읽기 및 쓰기) : 읽고 쓰기 위해 새 바이너리 파일을 만듭니다. 파일이 없으면 새 파일을 만듭니다.
    "Ab +"(읽기 및 쓰기): 바이너리 파일을 열고 파일 끝에서 읽고 합산합니다. 파일이 없으면 새 파일을 작성하고 작성하십시오.

     예 :

#include <stdio.h>
int main ()
{
    FILE * pFile;
    pFile = fopen ("myfile.txt","w");
    if (pFile!=NULL)
    {
        fputs ("fopen example",pFile);
        fclose (pFile);
    }
    return 0;
}

    개봉 후 pfile 포인터의 유효성을 판단합니다.

2. 파일의 순차적 읽기 및 쓰기

   몇 가지 입력 및 출력 기능을 소개합니다.

   (1) 문자 입력 함수 int fgetc (FILE * stream)  은 지정된 스트림에서 다음 문자 (부호없는 문자)를 가져와 위치 식별자를 앞으로 이동합니다. stream  은 작업이 수행 될 스트림을 식별하는 FILE 객체에 대한 포인터입니다. 이 함수는 unsigned char 강제 형식으로 읽은 문자를 int로 반환합니다. 파일 끝에 도달하거나 읽기 오류가 발생하면 EOF를 반환합니다. 적용 대상 : 모든 입력 스트림.

   (2) 문자 출력 함수  int fputc (int char, FILE * stream)  은 매개 변수 char  (부호없는 문자)에 지정된 문자를 지정된 스트림 스트림에 쓰고  위치 식별자를 앞으로 이동합니다. char  는 쓸 문자입니다. 문자는 해당하는 int 값과 함께 전달됩니다. stream 은 쓸 문자 스트림을 식별하는 FILE 객체에 대한 포인터입니다. 오류가 발생하지 않으면 쓰여진 문자가 반환됩니다. 오류가 발생하면 EOF가 반환되고 오류 식별자가 설정됩니다. 적용 대상 : 모든 입력 스트림.

   (3) 텍스트 줄 입력 함수 char * fgets (char * str, int n, FILE * stream)  은 지정된 스트림에서 한 줄을 읽고 str이  가리키는 문자열에 저장합니다  . 상황에 따라 (n-1)  문자를 읽거나 개행 문자를 읽거나 파일 끝에 도달하면 중지 됩니다  . str  은 읽을 문자열을 저장하는 문자 배열에 대한 포인터입니다. n  은 읽을 최대 문자 수입니다 (마지막 널 문자 포함). 일반적으로 str로 전달 된 배열의 길이가 사용됩니다. stream 은 문자를 읽을 스트림을 식별하는 FILE 객체에 대한 포인터입니다. 성공하면 함수는 동일한 str 매개 변수를 반환합니다. 파일 끝에 도달하거나 문자를 읽지 않으면 str의 내용은 변경되지 않고 널 포인터가 리턴됩니다. 오류가 발생하면 널 포인터가 리턴됩니다. 적용 대상 : 모든 입력 스트림.

   (4) 텍스트 라인 출력 함수  int fputs (const char * str, FILE * stream)  은 문자열을 지정된 스트림 스트림에 기록하지만 널 문자는 포함하지 않습니다. str 은 쓸 널로 끝나는 문자 시퀀스를 포함하는 배열입니다. 스트리밍  -이 파일 객체에 대한 포인터입니다 식별 문자열이 기록 될 수있는 스트림입니다. 이 함수는 음수가 아닌 값을 반환하거나 오류가 발생하면 EOF를 반환합니다. 적용 대상 : 모든 입력 스트림.

   (5) 형식화 된 입력 함수 int fputs (const char * str, FILE * stream)  은 문자열을 지정된 스트림 스트림에 기록하지만 널 문자는 포함하지 않습니다. str 은 쓸 널로 끝나는 문자 시퀀스를 포함하는 배열입니다. stream 은 문자열에 쓸 스트림을 식별하는 FILE 객체에 대한 포인터입니다. 이 함수는 음수가 아닌 값을 반환하거나 오류가 발생하면 EOF를 반환합니다. 적용 대상 : 모든 입력 스트림.

   (6) 형식화 된 출력 함수 int fprintf (FILE * stream, const char * format, ...)  는 형식화 된 출력을 스트림으로 보냅니다. stream스트림 을 식별하는 FILE 객체에 대한 포인터입니다. format 은 스트림에 쓸 텍스트를 포함하는 C 문자열입니다. 포함 된 형식 태그를 포함 할 수 있으며, 이는 후속 추가 매개 변수에 지정된 값으로 대체되고 필요에 따라 형식화 될 수 있습니다. 적용 대상 : 모든 입력 스트림.

   (7)  주어진 흐름 스트림 에서 이진 입력 size_t fread (void * ptr, size_t 크기, size_t nmemb, FILE * stream) 가   가리키는 ptr 배열로  데이터를 읽습니다  . ptr  은 최소 크기가 size * nmemb  바이트 인 메모리 블록에 대한 포인터  입니다. size 는 읽을 각 요소의 크기 ( 바이트)입니다. nmemb 는 요소의 수이고 각 요소의 크기는 size 바이트입니다. stream 은 입력 스트림을 지정하는 FILE 객체에 대한 포인터입니다. 성공적으로 읽은 요소의 총 수는 정수 데이터 유형 인 size_t 객체로 반환됩니다. 합계가 nmemb 매개 변수와 다른 경우 오류가 발생했거나 파일 끝에 도달했을 수 있습니다. 적용 대상 : 파일.

   (8) 바이너리 출력 size_t fwrite (const void * ptr, size_t size, size_t nmemb, FILE * stream)  은 ptr이  가리키는 배열의 데이터를 주어진  스트림에 씁니다   . ptr 은 기록 할 요소의 배열에 대한 포인터입니다. size  는 쓰여질 각 요소의 크기 ( 바이트)이고 nmemb  는 요소의 수이며 각 요소의 크기는 size 바이트입니다. stream  은 출력 스트림을 지정하는 FILE 객체에 대한 포인터입니다. 성공하면 함수는 정수 데이터 유형 인 총 요소 수를 나타내는 size_t 객체를 반환합니다. 번호가 nmemb 매개 변수와 다른 경우 오류가 표시됩니다. 적용 대상 : 파일.

3. 임의의 파일 읽기 및 쓰기

   (1) fseek는 파일 포인터의 위치와 오프셋에 따라 파일 포인터를 찾습니다.

int fseek ( FILE * stream, long int offset, int origin );

    성공하면 함수는 0을 반환하고 그렇지 않으면 0이 아닌 값을 반환합니다. stream스트림 을 식별하는 FILE 객체에 대한 포인터입니다. offset  은 이유의 상대 오프셋 ( 바이트)입니다. whence  는 오프셋이 추가되기 시작하는 위치입니다. 일반적으로 다음 상수 중 하나로 지정됩니다.

일정한 기술
SEEK_SET 파일의 시작
SEEK_CUR 파일 포인터의 현재 위치
SEEK_END 파일의 끝

   (2) ftell은 시작 위치에 상대적인 파일 포인터의 오프셋을 반환합니다.

long int ftell ( FILE * stream );

      stream은 스트림을 식별하는 FILE 객체에 대한 포인터입니다. 이 함수는 위치 식별자의 현재 값을 반환합니다. 오류가 발생하면 -1L이 반환되고 전역 변수 errno가 양수 값으로 설정됩니다.

   (3) 되감기는 파일의 시작 부분에 대한 파일 포인터의 위치를 ​​반환합니다.

void rewind(FILE *stream)

          stream  은 스트림 을 식별하는 FILE 객체에 대한 포인터입니다.

4. 파일 끝 판정

   int feof (FILE * stream)  은 주어진 스트림의 파일 끝 식별자를 테스트합니다.

   파일 읽기 과정에서 feof 함수의 반환 값을 직접 사용하여 파일이 끝났는지 여부를 확인할 수 없습니다. 오히려 파일 읽기가 끝날 때 읽기에 실패했는지 또는 파일 끝에 도달했는지 확인하는 데 사용됩니다.

 (1) 텍스트 파일 읽기가 완료되었는지 여부는 반환 값이 EOF (fgetc)인지 NULL (fgets)인지 판단합니다. 예 : fgetc는 EOF인지 판단하고 fgets는 반환 값이 NULL인지 판단합니다.

 (2) 바이너리 파일 읽기의 끝을 판단하고, 반환 값이 실제 읽을 수보다 작은 지 판단합니다. 예를 들어 : fread는 반환 값이 읽을 실제 숫자보다 작은 지 여부를 판단합니다.

텍스트 파일의 예 :

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int c; 
    FILE* fp = fopen("test.txt", "r");
    if(!fp) 
        {
            perror("File opening failed");
            return EXIT_FAILURE;
        }
    while ((c = fgetc(fp)) != EOF) 
        {
            putchar(c);
        }
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

 

추천

출처blog.csdn.net/RMA515T/article/details/115268682