150 likes | 288 Views
KAIST SPARCS SP Seminar Sung-Jin Hong serialx at serialx.net. Input / Output in C. C Standard Library (libc). 여러 가지 공통 연산과 입출력 , 문자열 처리에 대한 표준 기능들의 모음 System Call ( 운영체제에서 제공하는 기능 ) 은 운영체제마다 사용법이 다르다 . VC++(MS libc), gcc(glibc) 각자 다른 C Standard Library 내부 구현을 포함하고 있다 . ( 사용법은 동일 !).
E N D
KAIST SPARCS SP Seminar Sung-Jin Hong serialx at serialx.net Input / Output in C
C Standard Library (libc) • 여러 가지 공통 연산과 입출력, 문자열 처리에 대한 표준 기능들의 모음 • System Call (운영체제에서 제공하는 기능) 은 운영체제마다 사용법이 다르다. • VC++(MS libc), gcc(glibc) 각자 다른 C Standard Library 내부 구현을 포함하고 있다. (사용법은 동일!)
File I/O (stdio.h) • 파일 입출력을 위한 함수 집합 • 사용자에게 편리하도록 많은 부분들을 추상화 • FILE pointer 를 사용한 편한 데이터 관리 • 대부분의 libc 구현체들은 내부적으로 buffering 수행을 통해 성능이 좋다 • open, write 등의 system 함수보다 일반적으로 빠르다
fopen, fread, fwrite, fclose FILE *fp = fopen(“file.txt”, “r”); char buffer[1024]; fread(buffer, 1, 1024, fp); printf(“%s\n”, buffer); fclose(fp); FILE *fp2 = fopen(“file2.txt”, “w”); fwrite(buffer, 1, 1024, fp2); fclose(fp2);
fseek, feof, fgets • fseek: Open한 파일의 특정 위치로 옮긴다. fread 등의 함수를 사용하면 파일상의 현재 읽는 중인 위치를 가리키는 포인터가 증가한다. 이를 원하는 특정 위치로 이동시키는 함수이다. • feof: 파일을 끝까지 읽었을 경우 참을 반환, 아니면 거짓을 반환 (Console 에서 Ctrl+d 를 눌렀을 경우도 동일) • fgets: 현재 파일의 위치로부터 줄 바꿈(\n) 까지 버퍼로 읽어들임 • fgetc: 현재 파일로부터 한 개의 글자를 입력 받음 • fungetc: 현재 파일로부터 입력 받은 한 개의 글자를 버퍼에 돌려놓음
fseek, feof, fgets FILE *fp = fopen(“file.txt”, “r”); char buffer[1024]; fgets(buffer, 1024, fp); printf(“%s\n”, buffer); fseek(fp, -10, SEEK_END); fread(buffer, 1, 1024, fp); printf(“%s\n”, buffer); printf(“%d\n”, feof(fp));
FILE* ? • 연 파일에 대한 정보를 저장하고 있는 구조체 • 운영체제에서 관리하는 파일 헨들러 (fd) • 현재 읽고 있는 파일상의 위치 • 읽기/쓰기 버퍼의 위치와 크기 • 기타 libc 구현에 따라 추가적인 데이터가 존재할 수 있음
printf • 일정한 형식의 출력을 하고 싶을 때 사용한다 • int printf(const char *format, ...) • 예제 • printf("Color %s, number1 %d, number2 %05d, hex %x, float %5.2f.\n", "red", 123456, 89, 255, 3.14); • 출력: Color red, number1 123456, number2 00089, hex ff, float 3.14. • Aka. Placeholders (ex. ‘%s’, ‘%05d’) • ‘%’ + [0-9] + ‘.’ + [0-9] + [sdxfc…] = %([0-9]+\.[0-9])?[sdxfc…] • s = string, d = decimal, x = hexademical, f = float
*printf • 파일에 쓰고 싶을 때 • int fprintf(FILE *stream, const char *format, ...) • 문자열에 쓰고 싶을 때 • int sprintf (char *str, const char *format, ...) • 문자열에 안전하게 쓰고 싶을 때 • int snprintf(char *str, size_t size, const char *format, ...)
scanf • Inverse of printf • int scanf (char *format, ...); • int n; scanf("%d", &n); • Must use ‘&’ • Any whitespace characters is ignored. • sscanf, fscanf, vscanf, …
stdin, stdout, stderr • 프로그램 실행 시 기본적으로 정의되어 있는 FILE pointer • stdin: 기본입력 – 사용자 키보드로부터의 입력이나 pipe 를 사용한 입력에 해당 • stdout: 기본출력 – printf 등의 함수 사용시 출력이 되는 통로 • stderr: stdout 과 기능상 동일하나 에러 출력을 위해 추가됨
stdin, stdout, stderr int a, b; fscanf(stdin, “%d %d”, &a, &b); fprintf(stdout, “%d+%d = %d”, a, b, a+b); fprintf(stderr, “test error msg”);
stdin, stdout, stderr serialx:~$ ./a.out 10 50 10+50 = 60 test error msg serialx:~$ echo “20 30 ” > input.txt serialx:~$ ./a.out <input.txt >output.txt test error msg serialx:~$ ./a.out <input.txt >output.txt 2> error.txt serialx:~$ cat error.txt test error msg
Problem #1 • scanf 를 통해 실수 두 개를 입력 받고, 입력 받은 두 수의 합을 출력하는 프로그램을 작성하라. • input.txt 파일에서 각 줄마다 두 숫자를 입력받고 이 두 숫자의 곱을 output.txt 에 출력하는 프로그램을 작성하라.
Problem #2 • stdin 으로부터 임의의 숫자를 입력 받고 이의 합을 출력하는 프로그램을 구현하라. • stdin 으로부터 숫자 하나를 입력받아 이를 소인수분해 해 출력하는 프로그램을 구현하라. • 임의의 숫자를 입력 받아 이 숫자의 합을 소인수분해 하는 프로그램을 구현하라.