파일 시스템

C : 2007. 11. 3. 12:13
1.

* 파일을 열고 닫는 방법

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 - 컴파일러가 지원하는 가장 큰 객체의 크기에 해당하는 값을 저장할수 있도록 한다.

Posted by 청웨일