C, C++

16. 파일 입출력

Yongs12 2023. 6. 7. 21:47

파일 열기 fopen( )

// 파일 포인터 선언
FILE *fp;

// 파일 열기 위한 함수 fopen("파일 이름", "파일 모드");
fp = fopen("test.txt", "r");
파일 모드 (기본 텍스트 속성) 내용
r 읽기 모드 파일이 없으면 NULL을 반환
w 쓰기모드 파일이 없으면 새로 생성하고 파일이 이미 존재하면 기존 내용을 삭제하고 다시 만듬
a 추가 모드 파일이 없으면 새로 생성하고 파일이 이미 존재하면 파일 끝에 내용 추가
r+ 읽기 및 쓰기 모드 파일이 없으면 NULL을 반환
w+ 읽기 및 쓰기 모드 파일이 없으면 새로 생성하고 파일이 이미 존재하면 기존 내용을 삭제하고 다시 만듬
a+ 추가 및 읽기 모드 파일이 없으면 새로 생성하고 파일이 이미 존재하면 파일 끝에 내용 추가

rb, wb등 파일모드 뒤에 "b"를 추가하면 이진 파일로 열 수 있다.
텍스트파일이 아닌 실행, 이미지 등등의 파일은 이진파일로 연다

 

 

보안이 강화 된 파일 열기 fopen_s( )

// 파일 포인터 선언
FILE* fp;
    
// fopen_s(파일 포인터 주소, "파일 이름", "파일 모드");
fopen_s(&fp, "Test.txt", "r")
fopen_s() 함수는 파일 열기 시 보안상의 이유로 런타임에 파일 이름이나 모드에 대한 검사를 수행
하여 파일 이름이나 모드가 유효하지 않을 경우 오류 코드를 반환하고 파일 포인터를 NULL로 설정한다.

 

파일 닫기 fclose( ) 

// 파일 포인터 선언
FILE *fp;

// 파일 열기 위한 함수 fopen("파일 이름", "파일 모드");
fp = fopen("test.txt", "r");

// 파일은 열었으면 항상 닫아줘야 한다.
fclose(fp);

 

 

파일 읽기
1. fread( ) : Byte 단위로 파일을 읽는다.

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 읽어들인 내용을 저장할 공간
    char buffer[255];

    // 파일을 읽기 모드로 열기
    fopen_s(&fp, "Test.txt", "r");
      
    // fread(읽어들일 공간, 한번에 읽을 크기, 몇개를 읽을 것인지 개수, 파일 포인터);
    fread(buffer, sizeof(char), sizeof(buffer), fp);
    
    printf("%s", buffer);

    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}

 

 

2. fgets( ) : 한 줄씩 문자열 형태로 파일을 읽는다.

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 읽어들인 내용을 저장할 공간
    char buffer[255];

    // 파일을 읽기 모드로 열기
    fopen_s(&fp, "Test.txt", "r");
       
    // fgets(읽어들일 공간, 최대 몇개를 읽을 것인지 개수, 파일 포인터);
    fgets(buffer,255, fp);
    
    printf("%s", buffer);

    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}

 

 


3. fscanf( ) : 형식 문자열을 이용해서 파일에서 값을 읽는다.
보안 기능이 추가 된 fscanf_s( ) 사용이 권장됨 버퍼 오버런과 같은 보안 취약점을 방지할 수 있음

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 읽어들인 내용을 저장할 공간
    char buffer[255];
    int  count[10];

    // 파일을 읽기 모드로 열기
    fopen_s(&fp, "Test.txt", "r");
       
    // fscanf(파일 포인터, 읽을 형식 , 형식에 맞는 저장할 공간의 주소);
    // 읽을 형식을 추가할 수 있음
    fscanf(fp, "%s %d", buffer, &count);

    printf("%s", buffer);

    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}

 

 

 

파일 쓰기
1. fwirte( ) : Byte 단위로 파일에 쓴다.

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 파일에 쓰기 위한 문자열
    char buffer[10] = "Test";
    
    // 파일을 쓰기 모드로 연다
    fopen_s(&fp, "Test.txt", "w");
    
    // fwrite(쓰기 위한 포인터, 문자 하나의 크기, 몇개를 쓸것 인지, 쓸 곳의 파일 포인터);
    fwrite(buffer, sizeof(char), sizeof(buffer), fp);
    
    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}

 

 

2. fputs( ) : 문자열 형태로 파일에 쓴다.

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 파일에 쓰기 위한 문자열
    char buffer[10] = "Test";
    
    // 파일을 쓰기 모드로 연다
    fopen_s(&fp, "Test.txt", "w");
    
    // fputs(쓸 내용이 담긴 포인터 변수, 쓸 곳의 파일 포인터);
    fputs(buffer, fp);
    
    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}

 

3. fprintf( ) : 형식 문자열을 이용해서 파일에 값을 쓴다.

int main() 
{
    // 파일 포인터 선언
    FILE* fp = NULL;
    
    // 파일에 쓰기 위한 문자열
    char buffer[10] = "Test";
    
    // 파일을 쓰기 모드로 연다
    fopen_s(&fp, "Test.txt", "w");
    
    // fprintf(쓸 내용이 담긴 포인터 변수, "형식 문자열", 쓸 곳의 파일 포인터);
    fprintf(fp, "%s", buffer);
    
    // 파일을 열었으면 항상 닫아줘야 한다.
    fclose(fp);
    
    return 0;
}