LAB/C

C언어 파일 입출력

it-lab-0130 2024. 9. 1. 22:56

C언어 표준 입출력 스트림

C언어의 파일 입출력 함수 (Fopen/Fclose)

- fopen ( file open) : 파일을 여는 함수

즉, FILE 포인터를 반환하여 해당 파일에 대한 정보를 돌려줍니다.

FILE은 stdio.h 에 선언되어있는 구조체입니다.

해당 구조체에는 파일에 대한 열기, 읽기, 쓰기, 닫기에 관련된 모든 상태 정보가 들어 있습니다.

*** fopen 함수가 파일을 찾아 개방하면 파일 포인터를 반환합니다.

fopen 함수는 실제 파일이 있는 장치와 연결되는 스트림 파일을 메모리에 만듭니다. 그리고 스트림 파일에 접근할 수 있도록 파일 포인터를 반화나합니다. 이포인터를 가지면 입출력 함수를 통해 원하는 입출력 작업을 수행할 수 있다.

[형식]

FILE *fopen(const char *, const char *);

ex.) FILE *fp = fopen("a.txt","r");

+ 실행파일이 있는 곳이 아닌 경로를 적을 때 : fopen("c:\\source\\a.txt", "r");

** \\역슬래쉬로 디렉터리를 나타내는 기호를 사용한다.

=> 매개변수 1번째에는 파일의 이름 , 경로를 지정한 이름이 들어갈 수 있습니다.

=> 매개변수 2번째에는 mode에 맞게 처리를 할 수 있도록 합니다.

[Mode 종류]

*** "r" : 파일이 없을 때 NULL반환

- fclose ( file close) : 파일을 닫는 함수

[형식]

int fclose(FILE *stream);

=> 정상적으로 파일을 닫는 경우 0을 반환하고, 실패한 경우 -1을 반환합니다.

ex.) FILE *fp = fopen("a.txt","r");

fclose(fp);

FILE 구조체

파일 입출력 (fopen / fclose) 예제

 

 
#include<stdio.h>

int main()
{
  FILE *fp;

  fp = fopen("test.txt", "w");

  if(fp == NULL){
    printf("파일열기 실패\n");
  } else {
    printf("파일열기 성공\n");
  }

  fclose(fp);

  return 0;
}

=> "w" 모드 : 파일이 없다면 새로 생성된다.

파일 문자 단위 입력 fputc()

#include<stdio.h>

int main()
{
  FILE *fp;

  fp = fopen("test.txt", "w");

  if(fp == NULL){
    printf("파일열기 실패\n");
  } else {
    printf("파일열기 성공\n");
  }
  
  fputc('a', fp);
  fputc('b', fp);
  fputc('x', fp);

  fclose(fp);

  return 0;
}

=> fopen()파일을 열어 fputc() 함수를 이용하여 한 문자를 파일로 출력

파일 문자 단위 입력 fgetc()

- fgetc()함수는 파일포인터와 연결된 파일에서 하나의 문자를 읽어 반환하여 ch변수에 저장한 후 화면에 출력한다.

데이터를 모두 읽은 경우 반복을 끝내야 하므로 fgetc() 함수의 반환값을 반복문의 종료 조건에 사용한다.

"fgetc() 함수는 파일의 데이터를 모두 읽으면 EOF를 반환한다."

파일 문자 출력

 
#include<stdio.h>

int main()
{
  FILE *fp;
  int c;

  fp = fopen("test.txt", "w");

  if(fp == NULL){
    printf("파일열기 실패\n");
  } else {
    printf("파일열기 성공\n");
  }
  
  while((c = fgetc(fp)) != EOF){
    putchar(c);
  }

  fclose(fp);

  return 0;
}

=> EOF 란 End of File 의 약자로 파일의 끝을 나타내는 특수문자입니다.

즉 fgetc를 통해서 파일 포인터가 이동하며 최종적으로 EOF에 도달하면 반복문에서 빠져나와 파일 내용의 전부를 출력하는 형태.

문자열 단위 입출력

#include<stdio.h>
#include<memory.h>
#include<string.h>

int main()
{
  FILE *fp;
  char file_buff[100];
  fp = fopen("test_line.txt", "w");

  if (fp == NULL) printf("파일열기 실패\n");
  else printf("파일열기 성공\n");

  int i;

  for (i = 1; i <= 5; i++) {
    printf("파일에 적을 내용을 입력하세요 (%d번째 라인)\n", i);
    memset(file_buff, 0, sizeof(file_buff));
    scanf("%s", file_buff);
    file_buff[strlen(file_buff)] = '\n';

    fputs(file_buff, fp);
  }
  fclose(fp);

  fp = fopen("test_line.txt", "r");

  if (fp == NULL) printf("파일열기 실패\n");
  else printf("파일열기 성공\n");

  while(fgets(file_buff, sizeof(file_buff), fp) != NULL){
    printf("%s", file_buff);
    memset(file_buff, 0, sizeof(file_buff));
  }
  fclose(fp);

  return 0;
}
 

***memset의 경우 memory.h 헤더파일에 포함된 함수: memset() 함수를 이용해서 File buf에 있는 값을 0으로 초기화 해주는 작업

=> file_buff[strlen(file_buff)] = '\n';

file buffer에 줄바꿈 문자인 \n(개행)을 마지막 라인에 포함하여 해당 버퍼를 fputs를 이용해서 파일에 입력.

 

타입지정 예제

#include<stdio.h>

int main()
{
	FILE *fp;
	char name[20];
	int age;
	double height;
	double ave_age = 0;

	if ((fp = fopen("user_info.txt", "w")) == NULL) {
		printf("파일열기 실패\n");
	}

	int i;
	for (i = 0; i < 5; i++) {
		printf("%d번째 유저정보를 입력 (나이, 이름, 키 순): ", i);
		scanf("%d %s %lf", &age, name, &height);

		fprintf(fp, "%d %s %lf\n", age, name, height);
	}
	fclose(fp);

	if ((fp = fopen("user_info.txt", "r")) == NULL) {
		printf("파일열기 실패\n");
	}

	for (i = 0; i < 5; i++) {
		fscanf(fp, "%d %s %lf", &age, name, &height);
		ave_age += (double)age;
	}

	printf("유저들의 평균나이 : %0.2lf\n", ave_age / 5);
	fclose(fp);

	return 0;
}

 

입력한 내용을 토대로 user_info 파일이 만들어지고 선언한 자료형에맞게 입력되었다.