파일입출력

·2023년 3월 15일
0

C

목록 보기
11/13

📌파일에 출력하기("w")


fopen

FILE *fopen(const char* filename, const char* mode)
int main()
{
	FILE* fp;
	fp = fopen("a.txt", "w"); //지정한 파일과 소통하도록 스트림을 만들어준다.

	if (fp == NULL)
	{
		printf("Write Error!!\n");
		return 0;
	}

	fputs("Hello World!!! \n", fp);
	fclose(fp);
	return 0;
}

"w"로 전달했을 때 filename이 존재하지 않을경우 새로 만들고
동일한 파일이 있을경우 내용을 덮어쓰게 된다.

다른경로로 출력하려면
fp = fopen("C:\\AAAA\\a.txt, "w")
이런식으로 검색하면된다.
\\를 두개쓰는 이유는 \를 하나만 쓰면 escape character라고 인식되므로 두개써서 \라는걸 알려준다.

fputs

int fputs(const char* str, FILE* stream);

파일에 기록을 할 수 있다.

fclose

fclose(FILE* stream);

열려있는 스트림을 닫아준다.

📌파일에서 입력받기("r")

#include <stdio.h>

int main()
{
	FILE* fp;
	fp = fopen("a.txt", "r"); //지정한 파일과 소통하도록 스트림을 만들어준다.
	char buf[20];
	if (fp == NULL)
	{
		printf("READ Error!!\n");
		return 0;
	}
	fgets(buf, 20, fp);
	printf("입력받는 내용 : %s \n", buf);
	fclose(fp);
	return 0;
}

"r"읽기 형식으로 파일을 열게된다.

fgets

char* fgets(char* str, int num, FILE* stream);

스트림에서 num-1개의 문자열을 입력받거나
개행문자나 파일끝까지 도달할 때까지 입력 받아서 str(문자열)로 저장한다.
NULL은 마지막에 자동으로 붙는다.

fgetc

#include <stdio.h>

int main()
{
	FILE* fp;
	fp = fopen("a.txt", "r"); //지정한 파일과 소통하도록 스트림을 만들어준다.
	char c;
	if (fp == NULL)
	{
		printf("READ Error!!\n");
		return 0;
	}

	while ((c = fgetc(fp)) != EOF)
	{
		printf("%c", c);
	}

	fclose(fp);
	return 0;
}

한글자씩 입력받기 파일끝은(EOF -1의값)로 구분한다.


📌파일 위치 지정자(Position Indicator)


파일에서 입력 받을 때 파일의 시작부분에서 끝 부분으로 쭉 입력 받았는데 이는 파일 위치 지정자가 있었기에 가능했다.

fseek

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

origin 인자로 전달된 위치로부터 offset 인자로 전달된 만큼 더한 위치로 가서 위치 지정자를 설정한다.
fseek(fp, 0, SEEK_SET)
파일(fp) 처음으로 돌아가서(SEEK_SET) 0의 위치(0)부터 읽어라

SEEK_SET 파일의 시작
SEEK_CUR 현재 파일 포인터의 위치
SEKK_END 파일의 끝


📌파일입출력 같이하기("r+", "w+")


"r+"

#include <stdio.h>

int main()
{
	FILE* fp = fopen("some_data.txt", "r+");
	char data[100];

	fgets(data, 100, fp);
	printf("현재 파일안에 있는 내용: %s\n", data);

	fseek(fp, 5, SEEK_SET);

	fputs("is nothing on this file", fp);

	fclose(fp);
	return 0;
}

읽기 및 쓰기형식으로 열겠다.
파일이 존재하지 않으면 열지 않는다.
파일이 존재한다면 내용은 놔두겠다.

"w+"

읽기 및 쓰기형식으로 열겠다.
파일이 존재하지 않는다면 파일을 새로 만들고
파일이 존재한다면 파일의 내용을 싹 지워버린다.

파일 입출력 같이 쓸때 주의사항

#include <stdio.h>

int main()
{
	FILE* fp = fopen("some_data.txt", "r+");
	char c;

	if (fp == NULL)
	{
		printf("파일 열기를 실패\n");
		return 0;
	}
	
	while ((c = fgetc(fp)) != EOF)
	{
		if (65 <= c && c <= 90)
		{
			fseek(fp, -1, SEEK_CUR);
			fputc(c + 32, fp);

			fseek(fp, 0, SEEK_CUR); //이부분
		}
		else if (97 <= c && c <= 122)
		{
			fseek(fp, -1, SEEK_CUR);
			fputc(c - 32, fp);

			fseek(fp, 0, SEEK_CUR); //이부분
		}
	}
	
	fclose(fp);
	return 0;
}

스트림 작업에서 읽기/쓰기를 변환할 때 반드시 fflush 함수 or fseek or rewind와 같은 함수를 호출하여 파일 위치 지정자를 다시 설정해줘야 한다. 안그러면 아래와 같이 됨

"a"

파일 뒤에 내용을 추가해준다(append)

int main() {
    FILE* fp = fopen("some_data.txt", "a");
    char c;
    if (fp == NULL) {
        printf("파일 열기를 실패하였습니다! \n");
        return 0;
    }
   
    fputs("ADDDDDDDDD", fp);
    fclose(fp);
}

📌fscanf


int fscanf(FILE* stream, const char* format, ...);

scanf와 유사한데 scanf는 stdin에서만 입력받고 fscanf는 임의의 스트림에서도 입력을 받을수 있다.
fscanf가 좀더 일반화된 함수이다.
\t, \n 둘중 하나가 나올때까지 입력받는다 -> 각 단어들을 하나씩 읽게된다.
스트림에서 읽어온다(쉽게 생각하면 파일에 있는 글자를 읽어온다)
성공하면 읽어들인 개수를 반환하고, 읽기 실패하면 EOF반환

된다.
#include <stdio.h>
int main() {
    FILE* fp = fopen("some_data.txt", "r+");
    char data[100];
    if (fp == NULL) {
        printf("파일 열기를 실패하였습니다! \n");
        return 0;
    }
   
    while (fscanf(fp, "%s", data) != EOF)
    {
        if (strcmp(data, "this") == 0)
        {
            fseek(fp, -(long)strlen("this"), SEEK_CUR);
            fputs("that", fp);
            fflush(fp);
        }
    }
}

this를 that으로 바꿔줌


📌fprintf


int fprintf(FILE *stream, const char* format, ...);

스트림에 문자열을 출력한다(쉽게 생각하면 파일에 글을쓴다)
쓰기에 성공하면 저장한 문자열의 크기를 바이트 단위로 반환하고, 실패하면 음수 반환한다.

int main(void)

{
    int num;
    int a;
    char c[100];

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

    while (num = (fscanf(fp,"%d %s", &a, c)) != EOF)
    {      
        fprintf(stdout, "%d %s\n", a, c);
    }

    fclose(fp);

    return 0;
}

fscanf로 읽어들이고 frpintf로 stdout(표준 출력 스트림)에 출력한다.


문제(파일입출력관련)


Problem6.c

참고자료


씹어먹는 C언어
TCPSchool

profile
개인공부저장용(하루의 기록)

0개의 댓글