* 파일을 열고 닫는 방법
FILE *fopen(char *파일이름, char *mode);
int fclose(FILE *fp); 열었으면 닫는다.
- mode
"r" - 읽기 위한 텍스트파일 열기
"w" - 쓰기 위한 텍스트파일 생성
"a" - 텍스트파일에 추가
"rb" - 읽기 위한 2진 파일 열기
"wb" - 쓰기 위한 2진 파일 생성
"ab" - 2진 파일에 추가
* 파일에서 문자들을 읽고 쓰는 방법
FILE - 파일의 크기, 현재 위치, 접근방법 등의 정보를 포함하는 구조체
fopen()함수가 실패하면 null이 반환된다.
null이 아니라는 것을 확인할 방법이 필요하다.
/*
if((fp = fopen("myfile.txt", "w")) ==NULL) {
printf("Cannot open file\n");
exit(1);
}
*/ null 포인트를 반환하면 프로그램을 종료한다.
int fgetc(FILE *fp);
- fp가 가리키는 파일에서 바이트를 문자형으로 읽어서 정수로 반환한다.
에러가 발생하면 EOF(파일의 끝)을 반환한다.
파일의 끝에 도달할때도 EOF를 반환한다.
int fputc(int ch, FILE *fp);
- ch의 하위바이트에 포함된 바이트를 fp와 관련된 파일에 문자형으로 쓴다.
수행되면 쓴문자를 반환하고 에러가 발생하면 EOF를 반환한다.
p.297
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[80] = "This is a file system test.\n";
FILE *fp;
char *p;
int i;
//출력을 위해서 myfile을 연다.
// fopen("myfile.txt", "w")
if((fp = fopen("myfile.txt", "w")) ==NULL) {
printf("Cannot open file\n");
exit(1);
}
//str을 디스크에 쓴다.
p = str;
while(*p) {
if(fputc(*p, fp) == EOF) {
printf("Error writiing file\n");
exit(1);
}
p++;
}
fclose(fp);
//입력을 위해서 myfile을 연다.
if((fp = fopen("myfile.txt", "r")) == NULL) {
printf("Cannot open file\n");
exit(1);
}
//파일을 다시 읽는다.
for(; ;) {
i = fgetc(fp);
if(i == EOF) break;
putchar(i);
}
fclose(fp);
return 0;
}
p.302_1
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
if(argc != 2) {
printf("wrong");
exit(1);
}
if((fp=fopen("myfile.txt", "r"))==NULL) {
printf("null space");
exit(1);
}
while((ch=fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
printf("\n\n");
return 0;
}
p.302_2
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int count[26]; //전역변수니까 기본적으로 0으로 초기화된다.
int main(int argc, char argv[])
{
FILE *fp;
char ch;
int i;
if(argc != 2) {
printf("weong");
exit(1);
}
if((fp=fopen("myfile.txt", "r"))==NULL) {
printf("null space");
exit(1);
}
while((ch=fgetc(fp))!=EOF) {
ch=toupper(ch);
if(ch>='A' && ch<='Z') count[ch-'A']++;
}
for(i=0; i<26; i++) printf("%c - %d\n", i+'A', count[i]);
fclose(fp);
}
2.
FILE *fopen(char *fname, char *mode);
- mode
"r" - 읽기 위한 텍스트파일 열기
"w" - 쓰기 위한 텍스트파일 생성
"a" - 텍스트파일에 추가
"rb" - 읽기 위한 2진 파일 열기
"wb" - 쓰기 위한 2진 파일 생성
"ab" - 2진 파일에 추가
int fclose(fp); - 파일을 닫는다.
int fgetc(FILE *fp);
- fp가 가리키는 파일에서 바이트를 문자형으로 읽어 정수로 반환한다.
- error가 발생하면 EOF(음의정수 -1)를 반환한다.
int fputc(int ch, FILE *fp);
- ch의 하위바이트에 포함된 바이트를 fp와 관련된 파일에 문자형으로 쓴다.
- ch가 정수형으로 정의되나 문자형으로 사용하여 함수를 호출할 수 있다.
- error가 발생하면 EOF를 반환한다.
3.
feof(*fp) - 파일의 끝에 도달하면 0이 아닌 값을 반환한다.
ferror(*fp) - 에러가 발생하면 0이 아닌 값을 반환한다.
4.
int fputs(char *str, FILE *fp); - fp와 관련된 파일에 str이 가리키는 문자열을 쓴다.
- 에러가 발생하면 EOF를 반환한다. 문자열 끝의 null은 기록되지 않는다.
char *fgets(char *str, int num, FILE *fp);
- 파일에서 문자들을 str이 가리키는 문자열에 넣는다.
- num값만큼 넣거나 뉴라인을 만나거나 파일의 끝에 도달할때까지 에러가 발생하면 널포인트를 반환한다.
*파일을 대상으로 입출력이 이루어진다.
fprintf(FILE *fp, char *cintrol-string, ...); - 파일에 출력한다.
fscanf(FILE *fp, char *cintrol-string, ...); - 파일에서 입력받는다.
5.
size_t fread(void *buffer, size_t size, size_t num, FILE *fp);
- fp와 관련된 파일에서 num개의 객체를 buffer가 가리키는 버퍼속으로 읽어들인다.
- 실제 읽은 객체의 수를 반환한다.
size_t fwrite(void *buffer, size_t size, size_t num, FILE *fp);
- buffer가 가리키는 버퍼에서 num개의 객체를 fp롸 관련된 파일에 쓴다.
- 쓰여진 객체의 수를 반환한다.
size_t - 컴파일러가 지원하는 가장 큰 객체의 크기에 해당하는 값을 저장할수 있도록 한다.