본문 바로가기

프로그램언어/C언어

c언어 파일 입출력

1. 파일 입출력

파일 포인터와 파일 열기
파일 입출력을 수행하려면 파일에 FILE형 포인터를 할당하여 주어야 한다. 이를 파일 열기라 한다. 파일을 열 때에 fopen() 함수를 사용한다.

함수 원형

    FILE *fopen(char *file, char *mode) 

file을 mode 상태로 열고 파일 포인터를 할당하여 되돌린다. 파일을 열지 못하면 NULL(0)을 되돌린다.

모드 설명
r 파일을 처음부터 읽기 위해 엽니다. 파일이 없으면 오류 발생
w 파일을 무조건 새로 생성하여 파일을 처음부터 쓰기 위해 엽니다..
파일이 존재하지 않으면 생성, 이미 존재하는 파일 내용은 삭제됨
a 파일의 끝에 새로운 내용을 추가하기 위해 엽니다. 파일이 존재하지 않으면 생성
r+ 이미 존재하는 파일을 읽기와 쓰기로 엽니다. 만약 파일이 없으면 오류가 발생
w+ 읽기와 쓰기로 엽니다. 파일이 무조건 새로 생성됨
a+ 파일의 끝에 새로운 내용을 추가하거나 읽기로 연니다. 파일이 없으면 생성
b 파일을 이진 모드로 엽니다.
t 파일을 텍스트 모드로 엽니다.

 

파일 닫기
파일에 대한 입출력이 끝났으면 fclose()함수를 사용하여 파일을 닫아 주어야 한다.

함수 원형

    int fclose( FILE *stream );   //stream : 개방된 FILE 구조체의 포인터 

 

    int fscanf( FILE *stream, const char *format [, argument].. ); 

//stream : 개방된 FILE 구조체의 포인터
//format : 형식 제어 문자열
//argument : 가변적인 매개변수
//반환값 : 읽혀진 필드의 수. 파일 끝 또는 에러 시 EOF(-1)

 

    int fprintf( FILE *stream, const char *format, [, argument].. ); 

//stream : 개방된 FILE 구조체의 포인터
//format : 형식 제어 문자열
//argument : 가변적인 매개변수
//반환값 : 출력한 바이트의 수. 에러 시 EOF(-1)

 

    char *fgets( char *string, int n, FILE *stream ); 

//string : 파일 데이터를 읽어서 저장할 버퍼의 포인터
//n : 읽을 최대 문자의 수 +1, 읽은 문자열의 끝에 NULL이 추가
//stream : 개방된 FILE 구조체의 포인터
//반환값 : 읽은 string의 포인터, 더 읽을 파일이 없거나 에러 시 NULL 포인터

 

    int feof( FILE *stream ); 

//stream : 개방된 FILE 구조체의 포인터
//반환값 : 파일의 끝이면 true, 끝이 아니면 false

 

예제 따라하기]

 

output.txt 파일을 생성하여 파일안에 출력한다.

소스코드 실행 결과

#include <stdio.h>
#include <math.h>
int main() {
    FILE *fout = fopen("output.txt", "w");
    int i;

    for(i=1; i<=5; i++) {
        fprintf(fout, "%d %5.3f\n", i, sqrt((float)i));
    }

    fclose(fout);

    return 0;
}

output.txt을 열어 출력 내용 확인]


1 1.000
2 1.414
3 1.732
4 2.000
5 2.236

 

output.txt 파일을 열고 파일 안에 있는 내용을 콘솔창에 출력한다.

소스코드 실행 결과

#include <stdio.h>
#include <math.h>
int main() { 
    FILE *fin = fopen("output.txt", "r");
    int n;
    double jggun;

    printf("n   n의 제곱근\n");
    while(1) {
        fscanf(fin, "%d %lfn", &n, &jggun);
        if(feof(fin))
            break;

        printf("%d   %5.3f\n", n, jggun);
    }


    fclose(fout);

    return 0;
}

n   n의 제곱근
1   1.000
2   1.414
3   1.732
4   2.000
5   2.236

 

text.txt 파일을 열고 한 문장씩 불러와 출력한다. (먼저 text.text 파일을 생성하여 아래 출력 결과 와같이 내용을 저장한다.)

소스코드 실행 결과

#include <stdio.h>
#include <math.h>
int main() { 
    FILE *pFile = fopen("text.txt", "r" );
    char strTemp[255];
    char *pStr;

    while( !feof( pFile ) ) {
        fgets( strTemp, sizeof(strTemp), pFile );
    printf( "%s", strTemp );
    }
    printf("\n");


    fclose(fout);

    return 0;
}

코딩 컴퓨터강사 
C 프로그래밍 시작
C++ 프로그래밍 시작
API 프로그래밍 시작
MFC 프로그래밍 시작

 

문제 풀어보기]

 

1. 두 개의 정수를 입력 받아 사각형의 넓이를 구하고 둘레의 길이를 구하여 각각 한 줄에 출력하시오.
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
10 15

출력 예]
150 50


2. 3개의 정수를 입력 받아 합계와 평균을 출력하되 평균은 소수 첫째자리까지 출력하되 아래와 같이 출력하시오. 
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
45 63 80

출력 예]
188 62.7


3. 두 정수와 한 개의 연산자(+, -, *, /, %)를 아래와 같이 입력 받아 계산하는 계산식을 출력하시오. 
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
45 + 50

출력 예]
45 + 50 = 95


4. 정수 n을 입력 받아 계승값을 출력하는 프로그램을 작성하여 출력 하시오. (단 정순 n은 10이하의 정수를 입력)
n! = n * (n-1) * (n-2) * (n-3) … 
즉, 5! = 5 * 4 * 3 * 2 * 1 이다.
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
5

출력 예]
120


5. 정수를 입력받아 3의 배수이면서 4의 배수인 정수를 모두 출력하고 0이 입력되면 그 이전까지 3의 배수이면서 4의배수인 정수의 개수를 아래와 같이 출력하시오. (단, 한개도 없을 경우에는 "0개"만 출력)
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
3 10 24 30 45 12 95 64 60 0

출력 예]
24 12 60
3개


6. 10 이하의 정수를 입력받아 아래와 같이 출력하시오. *과 * 사이는 공백으로 분리한다.
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
5

출력 예]
        *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *


7. 시작 년도와 끝 년도를 입력받아 그 사이에 윤년이 몇 번 있는지를 아래와 같이 출력하시오. 
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
2000 2008

출력 예]
3


8. 첫째 줄에 정수 n(2≤n≤100)을 입력받고 다음 줄부터 n명 학생의 3과목 점수를 입력받아 평균을 구하여 점수가 높은 순으로 출력하시오. 단, 평균은 소수 둘째 자리에서 반올림하여 소수 첫째 자리까지 출력하시오. 
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
5
87 56 78
98 87 78
45 67 89
34 99 86
90 87 88

출력 예]
88.3
87.7
73.7
73.0
67.0


9. 공백을 포함한 한 문장을 입력받아서 전체 길이와 가장 긴 단어를 출력하시오.
단, 문장의 길이는 최대 100자 이내이고, 길이가 가장 긴 단어가 여러 개인 경우 공백으로 분리하여 한 줄에 입력 받은 순서대로 모두 출력하시오.

이 문제에서의 단어란? 공백으로 분리하는 문자열을 뜻한다. 
"i am a boy." 문자열의 경우
"i", "am", "a", "boy."가 각각 단어이다.
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
The largest organ in the body is the liver.

출력 예]
43
largest


10. 10개의 단어를 입력받고 문자 하나를 더 입력 받는다. 문자를 포함하는 단어를 모두 찾아 사전 순으로 출력하시오. 단어는 100자 이하다. 
입력파일 = input.txt, 출력파일 = output.txt
입력 예]
hancom
korea
information
monitor
class
member
internet
bible
friends
forever
I

출력 예]
bible
friends
information
internet
monitor

'프로그램언어 > C언어' 카테고리의 다른 글

c언어 소수 구하기  (0) 2019.10.11
c언어 scanf 에러 발생  (0) 2019.10.10
c언어 표준 함수  (0) 2019.10.08
c언어 구조체와 공용체  (0) 2019.10.07
c언어 사용자 정의 함수  (0) 2019.10.04