산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 파일 처리

C 파일 처리

이 튜토리얼에서는 C에서 파일 처리에 대해 배울 것입니다. 다음을 통해 fprintf(), fscanf(), fread(), fwrite(), fseek() 등을 사용하여 C에서 표준 I/O를 처리하는 방법을 배웁니다. 예.

파일은 데이터를 저장하는 데 사용되는 컴퓨터 저장 장치의 컨테이너입니다.

<시간>

파일이 필요한 이유는 무엇입니까?

<시간>

파일 유형

파일을 다룰 때 알아야 할 두 가지 유형의 파일이 있습니다.

  1. 텍스트 파일
  2. 이진 파일

1. 텍스트 파일

텍스트 파일은 일반 .txt입니다. 파일. 메모장과 같은 간단한 텍스트 편집기를 사용하여 텍스트 파일을 쉽게 만들 수 있습니다.

해당 파일을 열면 파일 내의 모든 내용이 일반 텍스트로 표시됩니다. 내용을 쉽게 수정하거나 삭제할 수 있습니다.

유지 관리에 최소한의 노력이 필요하고 쉽게 읽을 수 있으며 최소한의 보안을 제공하고 더 큰 저장 공간을 차지합니다.

2. 바이너리 파일

바이너리 파일은 대부분 .bin입니다. 컴퓨터에 있는 파일.

데이터를 일반 텍스트로 저장하는 대신 이진 형식(0과 1)으로 저장합니다.

그들은 더 많은 양의 데이터를 보유할 수 있고 쉽게 읽을 수 없으며 텍스트 파일보다 더 나은 보안을 제공합니다.

<시간>

파일 작업

C에서는 텍스트 또는 이진 파일에 대해 네 가지 주요 작업을 수행할 수 있습니다.

  1. 새 파일 만들기
  2. 기존 파일 열기
  3. 파일 닫기
  4. 파일에서 정보 읽기 및 쓰기
<시간>

파일 작업

파일로 작업할 때 파일 형식의 포인터를 선언해야 합니다. 이 선언은 파일과 프로그램 간의 통신에 필요합니다.

FILE *fptr;
<시간>

파일 열기 - 생성 및 편집용

파일 열기는 fopen()를 사용하여 수행됩니다. stdio.h에 정의된 함수 헤더 파일.

표준 I/O에서 파일을 여는 구문은 다음과 같습니다.

ptr = fopen("fileopen","mode");

예를 들어,

fopen("E:\\cprogram\\newprogram.txt","w");

fopen("E:\\cprogram\\oldprogram.bin","rb");
표준 I/O에서 모드 열기
모드 모드의 의미 파일이 없는 동안
r 읽을 수 있도록 엽니다. 파일이 존재하지 않으면 fopen() NULL을 반환합니다.
rb 바이너리 모드에서 읽기 위해 엽니다. 파일이 존재하지 않는 경우 fopen() NULL을 반환합니다.
w 작성용으로 엽니다. 파일이 존재하면 그 내용을 덮어씁니다.
파일이 없으면 생성됩니다.
wb 바이너리 모드에서 쓰기 위해 엽니다. 파일이 존재하면 그 내용을 덮어씁니다.
파일이 없으면 생성됩니다.
a 추가를 위해 엽니다.
데이터는 파일 끝에 추가됩니다.
파일이 없으면 생성됩니다.
ab 이진 모드에서 추가를 위해 엽니다.
데이터는 파일 끝에 추가됩니다.
파일이 없으면 생성됩니다.
r+ 읽기와 쓰기 모두 가능합니다. 파일이 없으면 fopen() NULL을 반환합니다.
rb+ 바이너리 모드에서 읽기와 쓰기 모두 가능합니다. 파일이 없으면 fopen() NULL을 반환합니다.
w+ 읽기와 쓰기 모두 가능합니다. 파일이 존재하면 그 내용을 덮어씁니다.
파일이 없으면 생성됩니다.
wb+ 바이너리 모드에서 읽기와 쓰기 모두 가능합니다. 파일이 존재하면 그 내용을 덮어씁니다.
파일이 없으면 생성됩니다.
a+ 읽기 및 추가할 수 있습니다. 파일이 없으면 생성됩니다.
ab+ 바이너리 모드에서 읽기 및 추가를 위해 엽니다. 파일이 없으면 생성됩니다.
<시간>

파일 닫기

파일(텍스트 및 바이너리 모두)은 읽기/쓰기 후에 닫아야 합니다.

파일 닫기는 fclose()을 사용하여 수행됩니다. 기능.

fclose(fptr);

여기 fptr 닫을 파일과 관련된 파일 포인터입니다.

<시간>

텍스트 파일 읽기 및 쓰기

텍스트 파일을 읽고 쓰기 위해 fprintf() 함수를 사용합니다. 및 fscanf().

printf()의 파일 버전일 뿐입니다. 및 scanf() . 유일한 차이점은 fprintf()fscanf() FILE 구조에 대한 포인터가 필요합니다.

<시간>

예제 1:텍스트 파일에 쓰기

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   // use appropriate location if you are using MacOS or Linux
   fptr = fopen("C:\\program.txt","w");

   if(fptr == NULL)
   {
      printf("Error!");   
      exit(1);             
   }

   printf("Enter num: ");
   scanf("%d",&num);

   fprintf(fptr,"%d",num);
   fclose(fptr);

   return 0;
}

이 프로그램은 사용자로부터 번호를 받아 program.txt 파일에 저장합니다. .

이 프로그램을 컴파일하고 실행하면 텍스트 파일 program.txt을 볼 수 있습니다. 컴퓨터의 C 드라이브에 생성됩니다. 파일을 열면 입력한 정수를 볼 수 있습니다.

<시간>

예시 2:텍스트 파일에서 읽기

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   fscanf(fptr,"%d", &num);

   printf("Value of n=%d", num);
   fclose(fptr); 
  
   return 0;
}

이 프로그램은 program.txt에 있는 정수를 읽습니다. 파일을 생성하여 화면에 출력합니다.

예 1에서 파일을 성공적으로 만든 경우 , 이 프로그램을 실행하면 입력한 정수를 얻을 수 있습니다.

fgetchar()와 같은 기타 기능 , fputc() 등도 비슷한 방식으로 사용할 수 있습니다.

<시간>

바이너리 파일 읽기 및 쓰기

함수 fread()fwrite() 바이너리 파일의 경우 각각 디스크의 파일을 읽고 쓰는 데 사용됩니다.

<시간>

바이너리 파일에 쓰기

바이너리 파일에 쓰려면 fwrite()을 사용해야 합니다. 기능. 함수는 4개의 인수를 사용합니다.

  1. 디스크에 기록할 데이터의 주소
  2. 디스크에 기록할 데이터의 크기
  3. 이러한 유형의 데이터 수
  4. 기록하려는 파일에 대한 포인터입니다.
fwrite(addressData, sizeData, numbersData, pointerToFile);
<시간>

예제 3:fwrite()를 사용하여 바이너리 파일에 쓰기

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5*n;
      num.n3 = 5*n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

이 프로그램에서 새 파일 program.bin을 만듭니다. C 드라이브에 있습니다.

threeNum 구조를 선언합니다. 세 개의 숫자 - n1, n2 및 n3 , 메인 함수에서 num으로 정의합니다.

이제 for 루프 내에서 fwrite()을 사용하여 파일에 값을 저장합니다. .

첫 번째 매개변수는 num의 주소를 사용합니다. 두 번째 매개변수는 threeNum 구조의 크기를 사용합니다. .

num 인스턴스를 하나만 삽입하기 때문에 , 세 번째 매개변수는 1입니다. . 그리고 마지막 매개변수 *fptr 데이터를 저장하고 있는 파일을 가리킵니다.

마지막으로 파일을 닫습니다.

<시간>

바이너리 파일에서 읽기

기능 fread() 또한 fwrite()와 유사한 4개의 인수를 사용합니다. 위와 같은 기능을 합니다.

fread(addressData, sizeData, numbersData, pointerToFile);
<시간>

예제 4:fread()를 사용하여 바이너리 파일에서 읽기

#include <stdio.h>
#include <stdlib.h>

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");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

이 프로그램에서 동일한 파일 program.bin를 읽습니다. 레코드를 하나씩 반복합니다.

간단히 말해서 하나의 threeNum을 읽습니다. threeNum 기록 *fptr이 가리키는 파일의 크기 num 구조로 .

예시 3에 삽입한 것과 동일한 레코드를 얻게 됩니다. .

<시간>

fseek()를 사용하여 데이터 가져오기

파일 내부에 많은 레코드가 있고 특정 위치의 레코드에 액세스해야 하는 경우 레코드를 가져오기 위해 이전의 모든 레코드를 반복해야 합니다.

이것은 많은 메모리와 작업 시간을 낭비하게 됩니다. fseek()를 사용하여 필요한 데이터에 더 쉽게 접근할 수 있습니다. .

이름에서 알 수 있듯이 fseek() 파일에서 주어진 레코드로 커서를 찾습니다.

<시간>

fseek()의 구문

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

첫 번째 매개변수 스트림은 파일에 대한 포인터입니다. 두 번째 매개변수는 찾을 레코드의 위치이고 세 번째 매개변수는 오프셋이 시작되는 위치를 지정합니다.

fseek()의 다른 출처
언제 의미
SEEK_SET 파일의 시작 부분에서 오프셋을 시작합니다.
SEEK_END 파일 끝에서 오프셋을 시작합니다.
SEEK_CUR 파일에서 커서의 현재 위치에서 오프셋을 시작합니다.
<시간>

예시 5:fseek()

#include <stdio.h>
#include <stdlib.h>

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");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }
   
   // Moves the cursor to the end of the file
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

이 프로그램은 program.bin 파일에서 레코드 읽기를 시작합니다. 역순으로(마지막에서 먼저) 인쇄합니다.


C 언어

  1. 자바 파일 클래스
  2. STL 파일 소개
  3. Verilog 파일 IO 작업
  4. C - 파일 I/O
  5. C - 헤더 파일
  6. C - 오류 처리
  7. C++ 파일 및 스트림
  8. C++ 신호 처리
  9. C# - 예외 처리
  10. C# - 파일 I/O