logo

C에서의 파일 처리의 기초

C에서의 파일 처리는 파일에 대한 생성, 열기, 읽기, 쓰기 및 닫기 작업을 수행하는 프로세스입니다. C 언어는 프로그램에서 입력, 출력 및 다양한 C 파일 작업을 수행하기 위해 fopen(), fwrite(), fread(), fseek(), fprintf() 등과 같은 다양한 기능을 제공합니다.

운영 체제 예

C에서 파일 처리가 필요한 이유는 무엇입니까?

지금까지 C 프로그램을 사용한 작업은 어디에도 저장되지 않은 프롬프트/터미널에서 수행되었습니다. 프로그램이 닫히면 출력이 삭제됩니다. 그러나 소프트웨어 산업에서는 대부분의 프로그램이 프로그램에서 가져온 정보를 저장하기 위해 작성됩니다. 파일 처리를 사용하는 것이 바로 상황에 필요한 것입니다.



파일 처리가 왜 중요한지 이해하기 위해 파일 사용의 몇 가지 기능을 살펴보겠습니다.

  • 재사용 성: 파일에 저장된 데이터는 언제 어디서나 접근, 업데이트, 삭제할 수 있어 높은 재사용성을 제공합니다.
  • 이식성: 데이터 손실 없이 파일을 다른 곳으로 전송할 수 있습니다. 컴퓨터 시스템에서. 이 기능을 사용하면 코딩 결함이 발생할 위험이 최소화됩니다.
  • 효율적인: 일부 프로그램에서는 많은 양의 입력이 필요할 수 있습니다. 파일 처리를 사용하면 몇 가지 지침을 사용하여 파일의 일부에 쉽게 액세스할 수 있으므로 많은 시간이 절약되고 오류 가능성이 줄어듭니다.
  • 저장 용량: 파일을 사용하면 프로그램에 모든 것을 동시에 저장하는 것에 대해 걱정할 필요 없이 많은 양의 데이터를 저장할 수 있습니다.

C의 파일 유형

파일은 파일이 데이터를 저장하는 방식에 따라 두 가지 유형으로 분류될 수 있습니다. 그것들은 다음과 같습니다:

  • 텍스트 파일
  • 바이너리 파일



1. 텍스트 파일

텍스트 파일에는 다음과 같은 데이터가 포함되어 있습니다. ASCII 문자 형식 일반적으로 문자 스트림을 저장하는 데 사용됩니다.

  • 텍스트 파일의 각 줄은 새 줄 문자(' ')로 끝납니다.
  • 모든 텍스트 편집기에서 읽거나 쓸 수 있습니다.
  • 일반적으로 다음과 같이 저장됩니다. .txt 파일 확장자.
  • 텍스트 파일을 사용하여 소스 코드를 저장할 수도 있습니다.

2. 바이너리 파일

바이너리 파일은 다음과 같은 데이터를 포함합니다. 이진 형식(예: 0과 1) ASCII 문자 대신. 여기에는 주 메모리에 저장되는 방식과 유사한 방식으로 저장되는 데이터가 포함됩니다.

  • 바이너리 파일은 프로그램 내에서만 생성될 수 있으며 해당 내용은 프로그램에서만 읽을 수 있습니다.
  • 쉽게 읽을 수 없으므로 더욱 안전합니다.
  • 일반적으로 다음과 같이 저장됩니다. .큰 상자 파일 확장자.

C 파일 작업

C 파일 작업은 다음과 같이 C에서 파일에 대해 수행할 수 있는 다양한 작업을 나타냅니다.



  1. 새 파일 만들기 – a, a+, w, w+ 속성을 갖는 fopen()
  2. 기존 파일 열기 – fopen()
  3. 파일에서 읽기 – fscanf() 또는 fgets()
  4. 파일에 쓰기 – fprintf() 또는 fputs()
  5. 파일의 특정 위치로 이동 – fseek() , 되감기()
  6. 파일 닫기 – fclose()

강조 표시된 텍스트에는 파일 작업을 수행하는 데 사용되는 C 함수가 언급되어 있습니다.

C 파일 작업을 위한 함수

C에서의 파일 처리

C의 파일 포인터

파일 포인터는 열린 파일의 특정 위치에 대한 참조입니다. 읽기, 쓰기, 닫기 등과 같은 모든 파일 작업을 수행하기 위해 파일 처리에 사용됩니다. 파일 파일 포인터 변수를 선언하는 매크로입니다. FILE 매크로는 내부에 정의되어 있습니다. 헤더 파일.

파일 포인터의 구문

  FILE*     pointer_name  ;>

파일 포인터는 C의 거의 모든 파일 작업에 사용됩니다.

C에서 파일 열기

C에서 파일을 열려면 fopen() 함수는 필수 액세스 모드와 함께 파일 이름 또는 파일 경로와 함께 사용됩니다.

fopen() 구문

FILE*   fopen  (const char *  file_name  , const char *  access_mode  );>

매개변수

  • 파일 이름 : 소스 파일과 동일한 디렉터리에 있는 파일의 이름입니다. 그렇지 않으면 전체 경로입니다.
  • 액세스 모드: 파일이 열리는 작업을 지정합니다.

반환 값

  • 파일이 성공적으로 열리면 파일 포인터를 반환합니다.
  • 파일이 열려 있지 않으면 NULL을 반환합니다.

C의 파일 열기 모드

파일 열기 모드 또는 액세스 모드는 열릴 파일에 대해 허용되는 작업을 지정합니다. 이는 fopen() 함수에 인수로 전달됩니다. 일반적으로 사용되는 파일 액세스 모드 중 일부는 다음과 같습니다.

오프닝 모드 설명
아르 자형 파일을 검색합니다. 파일이 성공적으로 열리면 fopen()은 파일을 메모리에 로드하고 파일의 첫 번째 문자를 가리키는 포인터를 설정합니다. 파일을 열 수 없으면 fopen()은 NULL을 반환합니다.
rb 바이너리 모드에서 읽기 위해 열립니다. 파일이 존재하지 않으면 fopen()은 NULL을 반환합니다.
~ 안에 텍스트 모드로 쓰기 위해 엽니다. 파일이 있으면 해당 내용을 덮어씁니다. 파일이 없으면 새 파일이 생성됩니다. 파일을 열 수 없으면 NULL을 반환합니다.
wb 바이너리 모드로 쓰기 위해 엽니다. 파일이 있으면 해당 내용을 덮어씁니다. 파일이 존재하지 않으면 생성됩니다.
파일을 검색합니다. 파일이 성공적으로 열리면 fopen()은 파일을 메모리에 로드하고 파일의 마지막 문자를 가리키는 포인터를 설정합니다. 추가 모드에서만 열립니다. 파일이 없으면 새 파일이 생성됩니다. 파일을 열 수 없으면 NULL을 반환합니다.
ab 바이너리 모드에서 추가를 위해 엽니다. 데이터는 파일 끝에 추가됩니다. 파일이 존재하지 않으면 생성됩니다.
r+ 파일을 검색합니다. 성공적으로 열렸습니다. fopen()은 이를 메모리에 로드하고 그 안의 첫 번째 문자를 가리키는 포인터를 설정합니다. 파일을 열 수 없으면 NULL을 반환합니다.
rb+ 바이너리 모드에서 읽기 및 쓰기 모두 가능합니다. 파일이 존재하지 않으면 fopen()은 NULL을 반환합니다.
w+ 파일을 검색합니다. 파일이 있으면 해당 내용을 덮어씁니다. 파일이 없으면 새 파일이 생성됩니다. 파일을 열 수 없으면 NULL을 반환합니다.
wb+ 바이너리 모드에서 읽기 및 쓰기 모두 가능합니다. 파일이 있으면 해당 내용을 덮어씁니다. 파일이 존재하지 않으면 생성됩니다.
에이+ 파일을 검색합니다. 파일이 성공적으로 열리면 fopen()은 파일을 메모리에 로드하고 파일의 마지막 문자를 가리키는 포인터를 설정합니다. 읽기 모드와 추가 모드 모두에서 파일을 엽니다. 파일이 없으면 새 파일이 생성됩니다. 파일을 열 수 없으면 NULL을 반환합니다.
ab+ 바이너리 모드에서 읽기와 추가 모두를 위해 열립니다. 파일이 존재하지 않으면 생성됩니다.

위에서 설명한 것처럼 바이너리 파일에 작업을 수행하려면 마지막에 'b'를 추가해야 합니다. 예를 들어 w 대신 wb를 사용해야 하고, a+ 대신 a+b를 사용해야 합니다.

파일 열기의 예




// C Program to illustrate file opening> #include> #include> int> main()> {> >// file pointer variable to store the value returned by> >// fopen> >FILE>* fptr;> >// opening the file in read mode> >fptr =>fopen>(>'filename.txt'>,>'r'>);> >// checking if the file is opened successfully> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'now exit.'>);> >exit>(0);> >}> >return> 0;> }>

>

>

산출

The file is not opened. The program will now exit.>

파일이 소스 디렉터리에 존재하지 않기 때문에 열리지 않습니다. 그러나 fopen() 함수는 파일이 존재하지 않는 경우 파일을 생성할 수도 있습니다. 아래에 표시되어 있습니다.

C에서 파일 만들기

fopen() 함수는 파일을 열 수 있을 뿐만 아니라 파일이 아직 존재하지 않는 경우 파일을 생성할 수도 있습니다. 이를 위해서는 w, w+, wb, wb+, a, a+, ab, ab+와 같이 파일을 찾을 수 없는 경우 파일 생성을 허용하는 모드를 사용해야 합니다.

FILE *fptr; fptr =   fopen  ('  filename.txt  ', '  w  ');>

파일 열기의 예




// C Program to create a file> #include> #include> int> main()> {> >// file pointer> >FILE>* fptr;> >// creating file using fopen() access mode 'w'> >fptr =>fopen>(>'file.txt'>,>'w'>);> >// checking if the file is created> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'exit now'>);> >exit>(0);> >}> >else> {> >printf>(>'The file is created Successfully.'>);> >}> > >return> 0;> }>

>

>

산출

The file is created Successfully.>

파일에서 읽기

C의 파일 읽기 작업은 fscanf() 또는 fgets() 함수를 사용하여 수행할 수 있습니다. 두 함수 모두 scanf 및 gets와 동일한 작업을 수행했지만 추가 매개 변수인 파일 포인터를 사용했습니다. 파일에서 읽는 데 사용할 수 있는 다른 기능도 있습니다. 이러한 기능은 다음과 같습니다.

기능 설명
fscanf() 형식화된 문자열과 가변 인수 목록을 사용하여 파일에서 입력을 가져옵니다.
fgets() 파일의 전체 행을 입력하십시오.
fgetc() 파일에서 단일 문자를 읽습니다.
얻다() 파일에서 숫자를 읽습니다.
fread() 이진 파일에서 지정된 바이트의 데이터를 읽습니다.

따라서 파일을 한 줄씩 읽을 것인지 아니면 문자별로 읽을 것인지는 사용자에게 달려 있습니다.

예:

FILE * fptr;  fptr = fopen(fileName.txt, r); fscanf(fptr, '%s %s %s %d', str1, str2, str3, &year); char c = fgetc(fptr);>

getc() 및 기타 파일 읽기 함수는 읽는 동안 파일 끝에 도달하면 EOF(End Of File)를 반환합니다. EOF는 파일의 끝을 나타내며 해당 값은 구현에 따라 정의됩니다.

메모: 여기서 주목해야 할 점은 파일의 특정 부분을 읽은 후 파일 포인터가 자동으로 마지막으로 읽은 문자의 끝으로 이동한다는 것입니다.

파일에 쓰기

파일 쓰기 작업은 읽기 작업과 유사하게 fprintf() 및 fputs() 함수로 수행할 수 있습니다. C 프로그래밍은 다음과 같이 파일에 데이터를 쓰는 데 사용할 수 있는 몇 가지 다른 기능도 제공합니다.

기능 설명
fprintf() printf()와 유사하게 이 함수는 형식화된 문자열과 가변 인수 목록을 사용하여 출력을 파일에 인쇄합니다.
fput() 파일의 전체 줄을 인쇄하고 끝에 개행을 인쇄합니다.
fputc() 파일에 단일 문자를 인쇄합니다.
fputw() 파일에 숫자를 인쇄합니다.
fwrite() 이 함수는 지정된 양의 바이트를 바이너리 파일에 씁니다.

예:

FILE *fptr ;  fptr = fopen(fileName.txt, w); fprintf(fptr, '%s %s %s %d', 'We', 'are', 'in', 2012); fputc('a', fptr);>

파일 닫기

fclose() 함수는 파일을 닫는 데 사용됩니다. 파일 작업이 성공한 후에는 항상 파일을 닫아 메모리에서 제거해야 합니다.

fclose() 구문

  fclose  (  file_pointer  );>

어디에 파일_포인터 열린 파일에 대한 포인터입니다.

예:

FILE *fptr ; fptr= fopen(fileName.txt, w); ----------   Some file Operations   ------- fclose(fptr);>

C에서의 파일 처리 예

예시 1: 파일을 생성하고, 쓰고, 파일을 닫는 프로그램




// C program to Open a File,> // Write in it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Get the data to be written in file> >char> dataToBeWritten[50] =>'techcodeview.com-A Computer '> >'Science Portal for Geeks'>;> >// Open the existing file GfgTest.c using fopen()> >// in write mode using 'w' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'w'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened. '>);> >// Write the dataToBeWritten into the file> >if> (>strlen>(dataToBeWritten)>0) {> >// writing in the file using fputs()> >fputs>(dataToBeWritten, filePointer);> >fputs>(>' '>, filePointer);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(>'Data successfully written in file '> >'GfgTest.c '>);> >printf>(>'The file is now closed.'>);> >}> > >return> 0;> }>

>

>

산출

The file is now opened. Data successfully written in file GfgTest.c The file is now closed.>

이 프로그램은 다음 텍스트를 포함하는 소스 파일과 동일한 디렉터리에 GfgTest.c라는 파일을 생성합니다. techcodeview.com-A Computer Science Portal for Geeks.

예 2: 파일을 열고, 읽고, 파일을 닫는 프로그램




// C program to Open a File,> // Read from it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Declare the variable for the data to be read from> >// file> >char> dataToBeRead[50];> >// Open the existing file GfgTest.c using fopen()> >// in read mode using 'r' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'r'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened. '>);> >// Read the dataToBeRead from the file> >// using fgets() method> >while> (>fgets>(dataToBeRead, 50, filePointer)> >!= NULL) {> >// Print the dataToBeRead> >printf>(>'%s'>, dataToBeRead);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(> >'Data successfully read from file GfgTest.c '>);> >printf>(>'The file is now closed.'>);> >}> >return> 0;> }>

>

>

산출

The file is now opened. techcodeview.com-A Computer Science Portal for Geeks Data successfully read from file GfgTest.c The file is now closed.>

이 프로그램은 이전 예제에서 생성한 GfgTest.c라는 파일에서 텍스트를 읽고 이를 콘솔에 인쇄합니다.

바이너리 파일 읽기 및 쓰기

지금까지는 텍스트 파일 작업에 대해서만 설명했습니다. 바이너리 파일에 대한 작업은 약간의 차이만 제외하고 텍스트 파일 작업과 유사합니다.

바이너리 파일 열기

바이너리 모드에서 파일을 열려면 fopen() 함수에서 rb, rb+, ab, ab+, wb 및 wb+ 액세스 모드를 사용합니다. 또한 바이너리 파일 이름에 .bin 파일 확장자를 사용합니다.

fptr = fopen('filename.bin', 'rb');>

바이너리 파일에 쓰기

fwrite() 함수를 사용하여 바이너리 파일에 데이터를 씁니다. 데이터는 비트(0과 1)로 이진 파일에 기록됩니다.

fwrite() 구문

size_t   fwrite  (const void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

매개변수:

  • ptr: 기록할 메모리 블록에 대한 포인터입니다.
  • 크기: 기록할 각 요소의 크기(바이트)입니다.
  • nmemb: 요소의 수.
  • 파일_포인터 : 출력 파일 스트림에 대한 FILE 포인터입니다.

반환 값:

  • 작성된 객체 수입니다.

예: fwrite()를 사용하여 바이너리 파일에 쓰는 프로그램




// C program to write to a Binary file using fwrite()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >// Structure variable declared here.> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'wb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >int> flag = 0;> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >num.n1 = n;> >num.n2 = 5 * n;> >num.n3 = 5 * n + 1;> >flag =>fwrite>(&num,>sizeof>(>struct> threeNum), 1,> >fptr);> >}> >// checking if the data is written> >if> (!flag) {> >printf>(>'Write Operation Failure'>);> >}> >else> {> >printf>(>'Write Operation Successful'>);> >}> >fclose>(fptr);> > >return> 0;> }>

>

>

산출

Write Operation Successful>

바이너리 파일에서 읽기

fread() 함수는 C의 바이너리 파일에서 데이터를 읽는 데 사용할 수 있습니다. 데이터는 저장된 것과 동일한 형식, 즉 바이너리 형식으로 파일에서 읽혀집니다.

fread() 구문

size_t   fread  (void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

매개변수:

  • ptr: 읽을 메모리 블록에 대한 포인터입니다.
  • 크기: 읽을 각 요소의 크기(바이트)입니다.
  • nmemb: 요소의 수.
  • 파일_포인터 : 입력 파일 스트림에 대한 FILE 포인터입니다.

반환 값:

  • 작성된 객체 수입니다.

예: fread()를 사용하여 바이너리 파일에서 읽는 프로그램




// C Program to Read from a binary file using fread()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'rb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >fread>(&num,>sizeof>(>struct> threeNum), 1, fptr);> >printf>(>'n1: %d n2: %d n3: %d '>, num.n1, num.n2,> >num.n3);> >}> >fclose>(fptr);> >return> 0;> }>

>

>

산출

n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>

C의 fseek()

파일 내에 여러 레코드가 있고 특정 위치에 있는 특정 레코드에 액세스해야 하는 경우 레코드를 가져오기 전에 모든 레코드를 반복해야 합니다. 이렇게 하면 많은 메모리와 작업 시간이 낭비됩니다. 메모리 소비와 작업 시간을 줄이기 위해 다음을 사용할 수 있습니다. fseek() 필요한 데이터에 더 쉽게 접근할 수 있는 방법을 제공합니다. C의 fseek() 함수는 파일의 지정된 레코드에 대한 커서를 찾습니다.

fseek() 구문

int fseek(FILE *ptr, long int offset, int pos);>

fseek()의 예




// C Program to demonstrate the use of fseek() in C> #include> int> main()> {> >FILE>* fp;> >fp =>fopen>(>'test.txt'>,>'r'>);> >// Moving pointer to end> >fseek>(fp, 0, SEEK_END);> >// Printing position of pointer> >printf>(>'%ld'>,>ftell>(fp));> >return> 0;> }>

>

>

산출

81>

C의 되감기()

그만큼 되감기() 함수는 파일 포인터를 파일의 시작 부분으로 가져오는 데 사용됩니다. 시작 시 파일 포인터를 원할 때 fseek() 대신 사용할 수 있습니다.

rewind() 구문

  rewind   (  file_pointer  );>




// C program to illustrate the use of rewind> #include> int> main()> {> >FILE>* fptr;> >fptr =>fopen>(>'file.txt'>,>'w+'>);> >fprintf>(fptr,>'Geeks for Geeks '>);> >// using rewind()> >rewind>(fptr);> >// reading from file> >char> buf[50];> >fscanf>(fptr,>'%[^ ]s'>, buf);> >printf>(>'%s'>, buf);> >return> 0;> }>

>

>

산출

Geeks for Geeks>

C 파일 작업을 위한 추가 기능

다음 표에는 파일 작업을 수행하거나 수행을 지원하는 데 사용할 수 있는 몇 가지 추가 기능이 나열되어 있습니다.

기능 설명
fopen() 파일을 생성하거나 파일을 열 때 사용됩니다.
fclose() 파일을 닫는 데 사용됩니다.
fgets() 파일을 읽는 데 사용됩니다.
fprintf() 파일에 데이터 블록을 쓰는 데 사용됩니다.
fscanf() 파일에서 데이터 블록을 읽는 데 사용됩니다.
getc() 파일에서 단일 문자를 읽는 데 사용됩니다.
putc() 파일에 단일 문자를 쓰는 데 사용됩니다.
fseek() 파일 포인터의 위치를 ​​언급된 위치로 설정하는 데 사용됩니다.
ftell() 파일 포인터의 현재 위치를 반환하는 데 사용됩니다.
되감기() 파일 포인터를 파일의 시작 부분으로 설정하는 데 사용됩니다.
넣어() 파일에 정수를 쓰는 데 사용됩니다.
getw() 파일에서 정수를 읽는 데 사용됩니다.