C언어 파일 입출력 (2)

C언어 파일 입출력 (2)


이번에는 r+ w+ a+ 에 대해서 알아보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 파일에는 "aossuper8.tistory.com" 이라는 문자열이 들어가있다.
#include <stdio.h>
int main()
{
    FILE *fp;
    char data[100];
    fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt""r+");
    
    fgets(data, 100, fp);
    printf("현재 파일에 있는 내용 : %s\n", data);
 
    fseek(fp, 5, SEEK_SET);
 
    fputs("Hello World!!", fp);
    
    return 0;
}
cs

< 출력 >


정상적으로 출력 되는것을 볼수가 있고 메모장을 보자.



우리가 원하던 대로 잘 출력이 된다.

r+형은 읽고 쓰기가 가능하다 근데 파일이 없다면 열지를 않는다.

w+형은 읽고 쓰기가 가능한데 파일이 없으면 새로 만들고 파일이 있다면 내용을 싹 지워버린다.


파일 입출력에 대한 문제점??에 대해서 알아보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 파일에는 "AOSSuper8.TISTORY.com" 이라는 문자열이 들어가있다.
#include <stdio.h>
int main()
{
    FILE *fp;
    char c;
    fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt""r+");
    
    while ((c = fgetc(fp)) != EOF) {
        if (c >= 65 && c <= 90) {
            fseek(fp, -1, SEEK_CUR);
            fputc(c + 32, fp);
            //fseek(fp, 0, SEEK_CUR);
        }
        else if (c >= 97 && c <= 122) {
            fseek(fp, -1, SEEK_CUR);
            fputc(c - 32, fp);
            //fseek(fp, 0, SEEK_CUR);
        }
    }
    fclose(fp);
    
    return 0;
}
cs

이러한 코드가 있다.
이 코드는 문자를 하나하나씩 받아온다. 그 문자가 소문자이면 대문자로 변경해주고
대문자이면 소문자로 변경해주는 코드이다
만약 AOSSuper8이라는 문자가 있다면 A를 읽으면 현재 위치 지정자는 O에 있다.
그래서 fseek로 A에 위치시켜놓고 a로 바꾸도록 설정하고 있다.
이것을 실행시켜보면 실행은 되는데 정상적으로 실행이 되지 않는다.
메모장을 보면


이렇게 나온다.

뭐지?? 코드 상으로는 아무 문제도 없는데 말이다.

이유를 보면


* NOTE

스트림 작업에서 읽기/쓰기를 변환할 때에는 반드시 fseek 함수를 호출하거나 rewind 와 같은 함수를 호출하여 파일 위치 지정자를



다시 설정해줘야 하기 때문이다.

그래서 주석문을 삭제해주면 정상적으로 프로그램이 실행이 된다.

a 형식에 대해서 알아보자.

a 형식은 파일의 맨 끝부분에 내용을 넣을 때 사용된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
// 파일에는 "aossuper8.tistory.com" 이라는 문자열이 들어가있다.
#include <stdio.h>
int main()
{
    FILE *fp;
    fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt""a");
    
    fputs("c language easy hahaha", fp);
    
    fclose(fp);
    
    return 0;
}
cs

< 출력 >


이렇게 나온다.

a 설명은 이것만 하면 충분하다.



fprintf, fscanf_s를 사용해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
    FILE *fp;
    char name[10];
    int kor, eng;
 
    printf("1. 이름입력 : ");
    fscanf_s(stdin, "%s", name, sizeof(name));
 
    printf("2. 국어, 영어점수 입력 : ");
    fscanf_s(stdin, "%d %d"&kor, &eng);
 
    fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt""w");
    fprintf(fp, "%s %d %d %d\n", name, kor, eng, kor + eng);
    fprintf(stdout, "%s %d %d %d\n", name, kor, eng, kor + eng);
    
    fclose(fp);
    
    return 0;
}
cs

< 출력 >


정상적으로 출력이 된다. 메모장을 보자.


 정상적으로 출력이 되는 것을 볼 수가 있다.


fprintf와 fscanf_s는 printf와 scanf_s 사용하던 것처럼 사용하면 된다.

단, 제일 앞 매개변수에 스트림이 들어간다.


9행을 fscanf_s(fp, "%s", name, sizeof(name)); 을 사용하면 파일 안에 담겨 있는 문자열을 EOF 만날 때까지 && 사이즈만큼

입력을 받을 수가 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 메모장에는 aossuper8 tistory com 문자열이 있다.
#include <stdio.h>
int main()
{
    FILE *fp;
    char data[100];
    fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt""r");
    
    while (fscanf_s(fp, "%s", data, sizeof(data)) != EOF)
        printf("%s\n", data);
 
    fclose(fp);
    
    return 0;
}
cs

< 출력 >


잘 출력된다.
fgets는 \n이 나올때 까지 하나의 문자열로 받아들이지만 fscanf_s는 띄어쓰기, 탭 문자(\t), \n들 중 어느 하나가 나올 때 까지
입력받으므로 파일에서는 각 단어들을 하나씩 읽어들이게 된다.

파일 입출력 끝!!


댓글

Designed by JB FACTORY