C++에서 파일 처리

C++에서 파일 처리

파일 처리는 C++ 표준 라이브러리에서 제공하는 클래스를 사용하여 파일(예: .txt, .csv 등)을 읽고 쓰는 것을 의미합니다.

  • 프로그램이 RAM에서 실행된다는 것은 프로그램이 실행되는 동안에만 데이터가 존재한다는 의미입니다. 프로그램이 종료되면 RAM의 모든 데이터가 자동으로 손실됩니다.
  • 파일 처리를 사용하면 데이터를 보조 메모리(예: HDD 또는 SSD)에 저장하여 영구적으로 보존할 수 있으며 프로그램이 종료된 후에도 저장하고 액세스할 수 있습니다.
  • 파일 작업을 위해 C++에서는 파일 스트림 클래스를 제공합니다. ofstream ifstream fstream과 같은 헤더.

파일 열기

파일을 읽거나 쓰기 전에 먼저 파일을 열어야 합니다. 파일을 열면 해당 파일이 RAM에 로드됩니다. C++에서는 다음을 사용하여 스트림을 생성하여 파일을 엽니다. fstream 파일 스트림, 즉 파일에 대한 입력 및 출력을 위한 스트림을 나타내는 클래스입니다.

C++
   fstream     str  (  'filename.ext'       mode  );   

어디

  • str: 스트림에 지정된 이름
  • 파일 이름: 파일 이름
  • 방법 : 파일과 상호 작용하는 방식을 나타냅니다.

파일 열기 모드

파일 열기 모드는 파일이 읽기 쓰기 또는 추가를 위해 열려 있음을 나타냅니다. 다음은 C++의 모든 파일 모드 목록입니다.

방법 설명
iOS::에서 읽기용으로 파일이 열려 있습니다. 파일이 없으면 열기 작업이 실패합니다.
iOS::아웃 쓰기 위해 파일 열기: 내부 스트림 버퍼는 출력 작업을 지원합니다.
iOS::바이너리 작업은 텍스트가 아닌 바이너리 모드로 수행됩니다.
iOS::먹었다 출력 위치는 파일 끝에서 시작됩니다.
iOS::앱 모든 출력 작업은 기존 내용에 추가되는 파일 끝에서 발생합니다.
iOS::트렁크 파일을 열기 전에 파일에 있던 모든 내용은 삭제됩니다.

예를 들어 읽기 위해 파일을 열려면 다음 열기 모드를 사용합니다.

C++
   fstream     filein  (  'file.txt'       ios  ::  in  );   

마찬가지로 쓰기 위해 파일을 열려면 다음을 사용합니다.

C++
   fstream     fileout  (  'file.txt'       ios  ::  out  );   

OR 연산자(|)를 사용하여 이러한 모드를 결합할 수도 있습니다. 예를 들어 다음과 같이 읽기 및 쓰기 모드 모두에서 파일 스트림을 열 수 있습니다.

C++
   fstream     str  (  'file.txt'       ios  ::  in     |     ios  ::  out  );   

쓰기 모드로 열린 파일이 없으면 새 파일이 생성됩니다. 그러나 읽기 모드에서 열린 파일이 존재하지 않으면 새 파일이 생성되지 않고 예외가 발생합니다.

기타 파일 스트림

fstream C++에서 제공하는 유일한 파일 스트림은 아닙니다. 두 가지 더 전문화된 스트림이 있습니다:

  • ifstream : 입력 파일 스트림을 나타냅니다. fstream을 여는 것과 동일합니다. iOS::에서 방법.
  • 스트림의 : 출력 파일 스트림을 나타냅니다. fstream을 여는 것과 같습니다. iOS::아웃 방법.

위의 모드는 이러한 스트림의 기본 모드입니다. 이 모드는 변경할 수 없지만 다른 모드와 함께 클럽화할 수 있습니다. 이제 입력을 위해 다음과 같이 ifstream을 사용할 수도 있습니다.

C++
   ifstream     filein  (  'file.txt'  );   

마찬가지로 출력의 경우:

C++
   ofstream     fileout  (  'file.txt'  );   

파일에 데이터 쓰기

다음 중 하나를 사용하여 파일을 쓰기 모드로 열면 fstream 또는 스트림의 cout을 사용하여 비슷한 방식으로 쓰기 작업을 수행할 수 있습니다. < < operator.

C++
   #include          using     namespace     std  ;   int     main  ()     {      // Open a file      ofstream     file  (  'GFG.txt'  );          // Write the string to the file      file      < <     'Welcome to GeeksforGeeks.'  ;      return     0  ;   }   
쓰다GFG.text

파일에서 데이터 읽기

fstream 또는 ifstream을 사용하여 읽기 모드에서 파일을 열면 cin을 사용하여 비슷한 방식으로 쓰기 작업을 수행할 수 있습니다. >> 연산자.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      file     >>     s  ;      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


산출

 Read String: Welcome  

이것은 cin과 동일한 문제가 있습니다. 입력은 첫 번째 공백 문자까지만 사용됩니다. 이를 방지하기 위해 우리는 다음을 사용할 수 있습니다. getline() 표시된 대로 기능:

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


산출

 Read String: Welcome to GeeksforGeeks.  

파일 닫기

파일을 닫는다는 것은 관련 스트림을 닫고 사용 중인 리소스를 해제하는 것을 의미합니다. 특히 장기 실행 프로그램에서는 메모리 누수, 데이터 손실 등을 방지하기 위해 작업을 마친 후 파일을 닫는 것이 중요합니다.

C++에서는 다음을 사용하여 파일을 닫습니다. 닫다() 모든 파일 스트림에 존재하는 멤버 함수입니다.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      // Close the file      file  .  close  ();      return     0  ;   }   


산출

 Read String: Welcome to GeeksforGeeks.  

파일 처리 오류

파일을 찾을 수 없습니다. 디스크가 꽉 찼습니다. 등 파일 처리 시 다양한 유형의 오류가 발생할 수 있습니다. 우리 프로그램은 일반적인 오류를 예상하고 이를 적절하게 처리할 수 있어야 합니다. 다음은 파일 처리 중에 발생할 수 있는 몇 가지 일반적인 오류입니다.

파일 열기 실패

파일이 존재하지 않거나 프로그램에 파일을 열 수 있는 권한이 없는 등 다양한 이유로 인해 파일이 열리지 않는 경우가 있을 수 있습니다. 이 경우 다음을 사용할 수 있습니다. is_open() 파일 스트림 클래스의 멤버 함수를 사용하여 파일이 성공적으로 열렸는지 여부를 확인합니다.

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'nonexistent_file.txt'       ios  ::  in  );      // Check if the file is opened      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      file  .  close  ();      return     0  ;   }   


산출

 Error: Unable to open file!  

데이터 읽기/쓰기 실패

또 다른 일반적인 오류는 잘못된 모드 등의 이유로 데이터를 읽거나 쓰지 못하는 것입니다. 이 경우 각 읽기/쓰기 시도 후에 작업의 유효성을 검사할 수 있습니다. 예를 들어 getline()을 사용한 읽기는 다음과 같이 검증될 수 있습니다.

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'GFG.txt'       ios  ::  out  );      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;          // Checking if getline() read successfully or not      if     (  !  getline  (  file       line  ))      cerr      < <     'Error: Failed to read data'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


산출

 Error: Failed to read data  

파일 끝(EOF) 오류

파일 끝을 넘어서 읽으려고 하면 EOF 오류가 발생할 수 있습니다. 읽기 전에 파일의 끝을 확인하지 않으면 이런 일이 발생할 수 있습니다. 다음을 사용하여 EOF를 확인할 수 있습니다. eof() 회원 기능.

C++
   #include          using     namespace     std  ;   int     main  ()   {      ifstream     file  (  'GFG.txt'  );      if     (  !  file  .  is_open  ())      {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;      while     (  getline  (  file       line  ))      cout      < <     line      < <     endl  ;      // Check for eof      if     (  file  .  eof  ())      cout      < <     'Reached end of file.'      < <     endl  ;      else      cerr      < <     'Error: File reading failed!'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


산출

 Reached end of file.  

EOF를 확인하기 전에 읽기 작업도 검증했습니다. getline() 만 돌아올 것이다 nullptr 어떤 이유로 인해 읽기가 실패하더라도 마찬가지입니다.

바이너리 파일 처리

C++에서는 다음도 처리할 수 있습니다. 바이너리 파일 데이터를 원시 형식으로 저장합니다. 바이너리 데이터를 읽고 쓰려면 다음을 사용해야 합니다. iOS::바이너리 바이너리 파일을 생성/열 때 플래그입니다.

바이너리 파일에 쓰기

바이너리 파일에 데이터를 쓰려면 먼저 파일을 열거나 생성해야 합니다. iOS::바이너리 방법.

C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str     =     'Welcome to GeeksForGeeks'  ;      // Open a binary file for writing      ofstream     file  (  'fileBin.bin'       ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for writing.'  ;      return     1  ;      }      // Write the length of the string (size) to file first      size_t     strLength     =     str  .  length  ();      file  .  write  (  reinterpret_cast   <  const     char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Write the string to the binary file      file  .  write  (  str  .  c_str  ()     strLength  );      // Close the file      file  .  close  ();      return     0  ;   }   


산출

쓰기바이너리바이너리 파일

바이너리 파일에서 읽기

바이너리 파일에서 데이터를 읽기 위해 데이터를 쓰기 위해 바이너리 모드에서 파일을 여는 것과 마찬가지로 다음을 사용하여 읽기 모드에서 파일을 열어야 합니다. iOS::에서 .

통사론:

C++
   fstream     fileInstance  (  'fileName.bin'       ios  ::  in  |     ios  ::  binary  );   
C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str  ;      // Open the binary file for reading      fstream     file  (  'fileBin.bin'       ios  ::  in     |     ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for reading.'  ;      return     1  ;      }      // Read the length of the string (size) from the file      size_t     strLength  ;      file  .  read  (  reinterpret_cast   <  char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Allocate memory for the string and read the data      char     *  buffer     =     new     char  [  strLength     +     1  ];     // +1 for the null-terminator      file  .  read  (  buffer       strLength  );      // Null-terminate the string      buffer  [  strLength  ]     =     ''  ;      // Convert the buffer to a string      str     =     buffer  ;      // Print file data      cout      < <     'File Data: '      < <     str  ;      delete  []     buffer  ;      file  .  close  ();      return     0  ;   }   


산출

 File Data: Welcome to GeeksForGeeks  

기타 파일 작업

C++ 프로그램에서 파일을 조작하기 위해 더 많은 작업을 수행할 수도 있습니다. 일반적인 파일 작업 중 일부는 다음과 같습니다.

  • 파일을 삭제하는 C++ 프로그램
  • 기존 파일에 문자열 추가
  • 한 파일을 다른 파일로 복사
퀴즈 만들기