C 파일 처리: 초보자 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C에서 파일 처리에 대한 흥미로운 여정을 시작할 것입니다. 코드를 한 줄도 작성해 본 적이 없더라도 걱정 마세요 - 저는 여러분의 친절한 안내자가 되어, 단계별로 함께 나아갈 것입니다. 이 튜토리얼이 끝나면, 파일을 마치 프로처럼 조작할 수 있을 것입니다!

C - File I/O (File Handling)

파일 처리란 무엇이며 왜 필요한가요?

당신이 일기장을 쓰는 걸 상상해 봅시다. 매일 일기장을 열어 그날의 일기를 쓰고 닫습니다. 다음 날 다시 일기장을 열어 어제 쓴 것을 읽을 수 있습니다. C에서의 파일 처리는 이와 비슷하게 작동합니다!

파일 처리는 우리의 프로그램이 컴퓨터上的 파일과 상호작용할 수 있게 해줍니다. 새로운 파일을 생성하고, 파일에 데이터를 쓰고, 파일에서 데이터를 읽고, 기존 파일을 수정할 수 있습니다. 이는 프로그램이 실행이 끝난 후에도 정보를 저장하고 회수할 수 있게 해주는 중요한 기능입니다.

실제 사례

간단한 주소록 프로그램을 만들어 보겠습니다. 파일 처리가 없다면, 프로그램을 닫는 즉시 추가한 모든 연락처가 사라집니다. 파일 처리를 사용하면, 그 연락처를 파일에 저장하고 프로그램을 다시 시작할 때 불러올 수 있습니다. 멋지죠?

파일의 종류

C에서는 주로 두 가지 유형의 파일을 다룹니다:

  1. 텍스트 파일: 사람이 읽을 수 있는 텍스트를 포함합니다. Notepad에서 만들 수 있는 .txt 파일을 생각해 보세요.
  2. 바이너리 파일: 메모리에서와 같은 형식으로 데이터를 포함합니다. 사람이 직접 읽지 않도록 설계되었습니다.

이 튜토리얼에서는 초보자를 위해 텍스트 파일에 집중할 것입니다.

FILE 포인터: 파일 연산의 열쇠

파일을 다루기 전에, 매우 중요한 개념을 소개해야 합니다: FILE 포인터. 이는 파일을 다루기 위한 특별한 변수로 생각할 수 있습니다.

FILE 포인터를 다음과 같이 선언합니다:

FILE *filePointer;

이 스타터(*)에 대해 지금은 너무 걱정하지 마세요. 파일을 다루는 데 있어 항상 이렇게 FILE 포인터를 선언해야 한다는 것을 기억하세요.

파일 열기(생성)

이제 FILE 포인터가 준비되었으니, 파일을 열어보겠습니다. fopen() 함수를 사용합니다. 기본 문법은 다음과 같습니다:

filePointer = fopen("filename.txt", "mode");

"mode"는 C가 파일을 어떻게 다루고 싶은지 나타냅니다. 다음은 일반적인 모드입니다:

모드 설명
"r" 읽기: 파일을 읽기 위해 엽니다 (파일이 존재해야 합니다)
"w" 쓰기: 새로운 파일을 쓰기 위해 생성합니다 (파일이 존재하면 내용이 지워집니다)
"a" 추가: 파일에 추가합니다 (파일이 없으면 생성됩니다)
"r+" 읽기 및 쓰기: 파일을 읽기와 쓰기 위해 엽니다

예제를 보겠습니다:

FILE *filePointer;
filePointer = fopen("my_diary.txt", "w");

if (filePointer == NULL) {
printf("Oops! I couldn't create the file.");
return 1;
}

이 코드에서 우리는 "my_diary.txt" 파일을 쓰기 위해 열거나 생성하려고 합니다. if 문은 파일이 성공적으로 열렸는지 확인합니다. filePointer가 NULL이면, 무언가 잘못된 것입니다 (아마도 해당 위치에 파일을 생성할 권한이 없을 수 있습니다).

파일 닫기

파일을 다룰 때가 끝나면, 파일을 닫는 것이 매우 중요합니다. 이렇게 하면 모든 변경 사항이 저장되고 파일이 운영 체제로 다시 반환됩니다. 다음과 같이 합니다:

fclose(filePointer);

항상 파일을 닫는 습관을 들이세요! 방을 나갈 때 불을 끄는 것처럼, 좋은 습관입니다.

텍스트 파일에 쓰기

이제 파일을 열고 닫는 방법을 알고 있으므로, 파일에 데이터를 쓰는 방법을 배워보겠습니다. fprintf() 함수를 사용합니다. 이 함수는 printf() 함수와 유사하게 작동하지만, 파일에 데이터를 쓰는 데 사용됩니다.

FILE *filePointer;
filePointer = fopen("my_diary.txt", "w");

if (filePointer == NULL) {
printf("Oops! I couldn't create the file.");
return 1;
}

fprintf(filePointer, "Dear Diary,\nToday I learned about file handling in C!\n");

fclose(filePointer);

이 예제에서 우리는 파일에 두 줄을 씁니다. \n은 새 줄을 만듭니다.

텍스트 파일에서 읽기

파일에 쓰는 것과 마찬가지로, 파일에서 읽는 것도 간단합니다. fgets() 함수를 사용하여 파일에서 줄을 읽습니다.

FILE *filePointer;
char buffer[100];

filePointer = fopen("my_diary.txt", "r");

if (filePointer == NULL) {
printf("Oops! I couldn't open the file.");
return 1;
}

while (fgets(buffer, sizeof(buffer), filePointer) != NULL) {
printf("%s", buffer);
}

fclose(filePointer);

이 코드에서 우리는 파일을 줄 단위로 읽고, 각 줄을 콘솔에 출력합니다. while 루프는 fgets()가 NULL을 반환할 때까지 계속됩니다. 이는 파일의 끝에 도달했음을 의미합니다.

바이너리 파일 처리

지금까지 텍스트 파일에 대해 설명했지만, C는 바이너리 파일을 다루기도 합니다. 이는 복잡한 데이터 구조나 메모리에서와 같은 형식으로 데이터를 저장해야 할 때 특히 유용합니다.

다음은 바이너리 파일 연산에 사용되는 함수들입니다:

함수 설명
fread() 파일에서 바이너리 데이터를 읽습니다
fwrite() 바이너리 데이터를 파일에 씁니다
fseek() 파일의 특정 위치로 이동합니다
ftell() 파일의 현재 위치를 알려줍니다
rewind() 파일의 시작 위치로 이동합니다

이 튜토리얼에서는 이들 함수에 대해 자세히 설명하지 않겠지만, 더 복잡한 파일 연산을 할 준비가 되었을 때 유용하게 사용할 수 있습니다.

파일 이름 변경

마지막으로 파일 이름을 변경하는 방법을 배워보겠습니다. C는 rename() 함수를 제공하여 이 작업을 수행할 수 있습니다.

int result = rename("old_name.txt", "new_name.txt");

if (result == 0) {
printf("File renamed successfully!");
} else {
printf("Oops! Something went wrong.");
}

이 함수는 파일 이름이 성공적으로 변경되면 0을 반환하고, 오류가 발생하면 비零 값을 반환합니다.

결론

축하합니다! 파일 처리의 세계로 첫 걸음을 뗀 것입니다. 우리는 파일을 열고 닫고, 텍스트 파일에 쓰고 읽는 방법, 그리고 바이너리 파일과 파일 이름 변경에 대해 간단히 다루었습니다.

기억하세요, 연습이 완벽을 만듭니다. 이 개념들을 사용하여 간단한 프로그램을 만들어 보세요 - 아마도 디지털 일기장이나 기본 주소록 프로그램을 만들어 보세요. 이 함수들을 더 많이 사용할수록, 파일 처리에 익숙해질 것입니다.

계속 코딩하고, 계속 배우고, 가장 중요한 것은 즐겁게 만들어 보세요! 누가 알겠는가? 당신이 만든 파일 속에 다음 큰 앱이 숨겨져 있을지도 모릅니다!

Credits: Image by storyset