Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/C

Review 4 - File I / O in C

eatplaylove 2024. 7. 7. 16:00

https://eglife.tistory.com/71

 

Review 3 - Pointer & Array in C

https://eglife.tistory.com/70 Review 2 - Control Structures / Functions in Chttps://eglife.tistory.com/69 Review 1 - C programming basics이번엔 C 언어에 대한 복습이다. Python, C, C++ 이 3대장 중에 제일 까다로운 녀석... 당연

eglife.tistory.com

잠시 위 Link 이전 부분 Review

 

C 에서 Array는 Python과 달리 1개의 data type만 저장할 수 있고, size가 initialize할 때 fixed 된다. 이 때, compiler가 stack array memory 할당하기가 편하다.

 

Array의 이름 자체는 Array의 0번째 주소다. 즉, array의 이름만 쓰면 pointer와 같은 개념이다.

 

Array를 function의 parameter로 넘길땐 name[ ]  이렇게 대괄호를 써서 넘긴다.

 

String은 Character의 Array형태 표현이다.

 

2D Array에서 Array[0] 은 Array 0번째 전체를 가르킨다. 즉, arr[0] 은 &arr[0][0] 과 같고 arr[1]은 &arr[1][0] 과 같다.

 

 

1. One Charcter I / O

 

getchar는 python의 input( ) 함수와 같다. getchar를 통해 받은 character 하나는 c 라는 variable에 저장되는 구조다.

그리고 putchar에서 숫자를 받으면 그걸 ASCII 코드로 변환해서 받는다.

 

getchar 함수는 유저가 무언가를 입력하는 동시에 data를 빨아서 받아버리는데,

 

그걸 방지하고자 Buffer를 쓴다. 즉 Enter 칠 때 까지 data를 받지 않는다.

 

    char c1;
    char c2;
    printf("input c1 : \n");
    c1 = getchar();
    printf("input c2 : \n");
    c2 = getchar();

    printf("char 1 is %c, char 2 is %c \n",c1,c2);
    
  ---
input c1 : 
a
input c2 :
char 1 is a, char 2 is

 

여기서 getchar에 a 를 치고 enter를 치면, c1에 a가 입력되고 c2는 enter를 가져가버린다.

 

    char c1;
    char c2;
    printf("input c1 : \n");
    c1 = getchar();
    
    getchar();

    printf("input c2 : \n");
    c2 = getchar();

    printf("char 1 is %c, char 2 is %c \n",c1,c2);

    return 0;
    
input c1 : 
asd
input c2 :
char 1 is a, char 2 is d

 

이렇게 중간에 getchar()를 넣어버리면 그 놈이 enter를 잡아 먹어서 c1 / c2 모두에 값을 입력할 수 있다.

 

getchar() 함수는 input을 키보드에서 바로 가져오는 것이 아니고 Buffer에서 가져온다.

 

 

2. Printf

 

기본적으로 string을 출력하는데, 특정 special character 같은 것들은 '%'를 이용해 변환을 해준다.

 

printf 에서 %를 발견하면 그 뒤에 알파벳으로 해당 자리에 올 data의 type을 파악하고, 뒤에 콤마 value를 통해 해당 data를 받은 뒤에 이것을 string으로 변환해서 화면에 띄운다.

 

이를 태면 printf("get %d apples",100) 이라고 했을 때, %d 라는 것을 통해 해당영역에 int가 오고, 뒤에 100을 int->string 변환하는데 참고한다.

 

%u는 0을 포함한 자연수

 

3. Scanf

내가 입력한 값을 Variable에 할당하기 위해선 scanf에선 variable의 주소를 넘겨야 해서 &를 써준다.

 

단, Array의 이름만 넘기거나 Pointer를 넘기거나 할 때에는 이미 주소를 넘긴 것이라서 거기다가 또 &를 쓰면 이상한 결과가 나올 수 있으니 주의하자.

 

    int a;
    int b;
    scanf("%d\n%d",&a,&b);

    printf("A : %d, B:%d \n",a,b);
---
1
2
A : 1, B:2

 

이렇게 scanf 를 %d로 쓸 때는 편하다. %d 는 white space를 알아서 걸러주기 때문에 입력이 편하지만,

%c는 white space까지 포함시켜버리기 떄문에 주의가 요망된다.

 

그래서 아래의 경우 int a, b를 입력하고 enter가 buffer에 남아 있으면 scanf Char를 할 때 그 enter 값을 c에다가 입력시켜버리기 때문에, getchar() 같은 것을 넣어서 white space를 buffer에서 지워주고 다시 Char 값을 입력받는다.

 

    int a;
    int b;
    int* ptrb = &b;
    scanf("%d\n%d",&a,ptrb);
    printf("A : %d, B:%d \n",a,b);
    getchar();
    char c;
    scanf("%c",&c);
    putchar(c);

 

 

4. File IO

 

Python File I O 에서의 Cursor 역할을 File Pointer가 대신해준다.

 

 

get / put / scanf / print 모두 앞에 f 를 더해서 fget / fput / fscanf / fprint 등을 써서 file에 입력하고 file에서 data를 받아온다.

 

 

EOF ( End of file ) 이라는 것은 file이 끝났음을 나타내는 Comment이다.

 

    FILE* infile;
    FILE* outfile;
    char str[50];

    infile = fopen("input.txt","r");
    outfile = fopen("output.txt","w");

    while(fscanf(infile,"%s",str) != EOF){
        fprintf(outfile,"%s",str);
    }

    fclose(infile);
    fclose(outfile);
    ----------in----------
i love C language
C is easier to learn than PY
    ----------out---------
iloveClanguageCiseasiertolearnthanPY

 

output file에 되게 이상하게 입력이 되었다. 띄어쓰기가 다 무시됨;;

 

    while(fscanf(infile,"%s",str) != EOF){
        fprintf(outfile,"%s ",str);
    }

 

이렇게 while 문에 fprintf 할 때 띄어쓰기를 하나 써주면 output에 띄어쓰기가 반영이 된다.

 

i love C language. C is easier to learn than PY. 

 

int main(void){

    FILE* infile;
    FILE* outfile;
    char str[50];
    char c;

    infile = fopen("input.txt","r");
    outfile = fopen("output.txt","w");

    if(infile == NULL || outfile == NULL){
        printf("ERROR \n");
        return 0;
    }

    while((c= fgetc(infile)) != EOF){
        fputc(c,outfile);
    }

    fclose(infile);
    fclose(outfile);

 

그냥 이렇게 while 문에 fscanf , fprintf 말고 fgetc, fputc를 사용하면 온전히 infile data를 outfile에 옮길 수 있다.

fscanf , fprintf 를 쓰면 왜인지 모르겠는데 자꾸 output file에 text가 깨져서 저장이 된다.

 

얘네들은 String Type으로 써줄 때만 사용하는 것으로..

 

 

- E. O. D -

'SW 만학도 > C' 카테고리의 다른 글

Review 6 - Linked list in C  (0) 2024.07.10
Review 5 - Dynamic(Structure) in C  (0) 2024.07.08
Review 3 - Pointer & Array in C  (0) 2024.07.04
Review 2 - Control Structures / Functions in C  (0) 2024.07.03
Review 1 - C programming basics  (0) 2024.07.03