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라고 인식되므로 두개써서 \라는걸 알려준다.
int fputs(const char* str, FILE* stream);
파일에 기록을 할 수 있다.
fclose(FILE* stream);
열려있는 스트림을 닫아준다.
#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"읽기 형식으로 파일을 열게된다.
char* fgets(char* str, int num, FILE* stream);
스트림에서 num-1개의 문자열을 입력받거나
개행문자나 파일끝까지 도달할 때까지 입력 받아서 str(문자열)로 저장한다.
NULL은 마지막에 자동으로 붙는다.
#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의값)로 구분한다.
파일에서 입력 받을 때 파일의 시작부분에서 끝 부분으로 쭉 입력 받았는데 이는 파일 위치 지정자가 있었기에 가능했다.
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 파일의 끝
#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;
}
읽기 및 쓰기형식으로 열겠다.
파일이 존재하지 않으면 열지 않는다.
파일이 존재한다면 내용은 놔두겠다.
읽기 및 쓰기형식으로 열겠다.
파일이 존재하지 않는다면 파일을 새로 만들고
파일이 존재한다면 파일의 내용을 싹 지워버린다.
#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
와 같은 함수를 호출하여 파일 위치 지정자를 다시 설정해줘야 한다. 안그러면 아래와 같이 됨
파일 뒤에 내용을 추가해준다(append)
int main() {
FILE* fp = fopen("some_data.txt", "a");
char c;
if (fp == NULL) {
printf("파일 열기를 실패하였습니다! \n");
return 0;
}
fputs("ADDDDDDDDD", fp);
fclose(fp);
}
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으로 바꿔줌
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(표준 출력 스트림)에 출력한다.