C함수 파일 열기 

open() 함수

 

파일을 사용하기 위해 열기(open)합니다. 파일 열기에는 표준 함수인 fopen()이 있습니다. fopen() 이 표준 C 라이브러리에서 제공한다면 open()은 리눅스에서 제공하는 함수입니다.

 

  • 헤더: fcntl.h
  • 형태: int open (const char *FILENAME, int FLAGS[, mode_t MODE])
  • 인수: char *FILENAME 대상 파일 이름
           int FLAGS 파일에 대한 열기 옵션
           [, mode_t MODE] O_CREAT 옵션 사용에 의해 파일이 생성될 때 지정되는 파일 접근 권한
  • 반환: int 0 < 파일 열기에 성공하면 파일 디스크립터의 양의 정수 값 반환
               -1 == 실패

 

reference

파일을 open할 때는 용도에 따라 읽기 전용, 쓰기 전용 또는 읽기와 쓰기가 모두 되는 옵션을 지정하여 열기를 합니다. 아래의 옵션은 모두 fcntl.h 에 정의되어 있습니다.

열기 옵션 설명
O_RDONLY 읽기 전용응로 열기
O_WRONLY 쓰기 전용으로 열기
O_RDWR 읽기와 쓰기가 모두 가능

 

이 외에도 더 다양한 옵션이 있습니다.

기타 옵션 설명
O_CREAT 해당 파일이 없으면 생성합니다.
O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 입니다.
O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 합니다.
open( "jwmx", O_WRONLY | OCREAT, 0644);
O_EXCL O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라집니다.
O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있습니다.
fd = open( "./test.txt", O_WRONLY | O_CREAT | O_EXCL, 0644)
즉, 이렇게 O_EXCL을 함께 사용하면, 파일이 없을 경우에는 O_CREAT 영향을 받아 쓰기 전용의 파일이 생성하고, 파일이 이미 존재하면 open()이 실패됩니다.
O_TRUNC 기존의 파일 내용을 모두 삭제합니다.
O_APPEND 파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 됩니다.
O_NOCITTY 열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않습니다.
O_NONBLOCK 읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀합니다.
O_SYNC 쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다립니다. 즉, 물리적으로 쓰기가 완료되어야 복귀하게 됩니다.

 

예제

예제에서는 test.txt라는 파일이 없으면 파일을 생성하고 파일 않에 "forum.falinux.com"을 쓰기를 합니다. 그러나 이미 파일이 있다면 프로그램을 종료합니다.

#include <stdio.h>         // printf()
#include <string.h>        // strlen()
#include <fcntl.h>         // O_WRONLY
#include <unistd.h>        // write(), close()

int main()
{
   char  *temp = "badayak.com\n";
   int    fd;

   if ( 0 < ( fd = open( "./test.txt", O_WRONLY ¦ O_CREAT ¦ O_EXCL, 0644))) {
      write( fd, temp, strlen( temp));
      close( fd);
   } else {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}

 

실행 결과

$ ./a.out
$ cat ./test.txt
badayak.com

$

 

 

 

참고 :

https://badayak.com/4398

'Programming Language > C Language' 카테고리의 다른 글

C언어) getgid() 함수  (0) 2021.06.16
C언어) 파일 디스크립터(FD, File Descriptor)  (0) 2021.06.15
C언어) read() 함수  (0) 2021.06.15
C언어) strstr() 함수  (0) 2021.06.15
C언어) volatile 의 의미(뜻)  (0) 2020.11.20

strstr() 함수

 

이번에는 문자열 안에서 문자열로 검색하는 방법을 알아보겠습니다. strstr 함수는 문자열 안에서 문자열을 검색하며 string (find) string에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다).

 

  • strstr(대상문자열, 검색할문자열);
    • char *strstr(char * const _String, char const * const _SubString);
    • 문자열을 찾았으면 문자열로 시작하는 문자열의 포인터를 반환, 문자열이 없으면 NULL을 반환

 

문자열에서 문자 찾기(strchr)와 문자열 찾기(strstr) 중에서 어떤 함수를 자주 쓸까요? 실제로 워드나 메모장에서 검색을 할 때 문자보다는 단어로 검색하는 경우가 많습니다. 그러다 보니 프로그램을 만들 때도 문자열 찾기 함수를 더 자주 씁니다.

 

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

 

[string_find_string.c]

#include <stdio.h>
#include <string.h>    // strstr 함수가 선언된 헤더 파일

int main()
{
    char s1[30] = "A Garden Diary";     // 크기가 30인 char형 배열을 선언하고 문자열 할당

    char *ptr = strstr(s1, "den");      // den으로 시작하는 문자열 검색, 포인터 반환

    printf("%s\n", ptr);    // den Diary

    return 0;
}

 

[실행 결과]

den Diary

 

 

char *ptr = strstr(s1, "den");와 같이 strstr 함수에 문자열과 검색할 문자열을 넣어주면 해당 문자열로 시작하는 문자열의 위치(포인터)를 반환합니다.여기서는 "A Garden Diary"에서 "den"로 시작하는 문자열을 찾으므로 "den Diary"가 나옵니다. 즉, 검색한 문자 "den"만 나오지 않고 뒤에 오는 모든 문자열이 나옵니다(NULL이 나오기 전까지).

 

 그림 44‑4 strstr 함수로 문자열 검색

 

strstr 함수도 대소문자를 구분합니다.

 

strchr 함수처럼 strstr 함수도 while 반복문을 사용하여 문자열을 계속 검색할 수 있습니다.

 

[string_find_string_while.c]

char s1[100] = "A Garden Diary A Garden Diary A Garden Diary";

char *ptr = strstr(s1, "den");     // den으로 시작하는 문자열 검색, 포인터 반환

while (ptr != NULL)                // 검색된 문자열이 없을 때까지 반복
{
    printf("%s\n", ptr);           // 검색된 문자열 출력
    ptr = strstr(ptr + 1, "den");  // den 포인터에 1을 더하여 e부터 검색
}

 

[실행 결과]

den Diary A Garden Diary A Garden Diary
den Diary A Garden Diary
den Diary

 

 

 

참고 :

https://dojang.io/mod/page/view.php?id=371

'Programming Language > C Language' 카테고리의 다른 글

C언어) getgid() 함수  (0) 2021.06.16
C언어) 파일 디스크립터(FD, File Descriptor)  (0) 2021.06.15
C언어) read() 함수  (0) 2021.06.15
C언어) open() 함수  (0) 2021.06.15
C언어) volatile 의 의미(뜻)  (0) 2020.11.20

volatile 이란 "휘발성이 있는, 날라가는 성질이 있는" 이라는 뜻의 영단어입니다.

 

변수 선언 시에 volatile 을 붙이게 되면, 이 변수의 내용은 언제든지 변할 수 있기 때문에, 최적화하지 말아달라는 의미입니다.

 

 

예를 들어서, 아래와 같은 코드를 작성했다고 하면

 

int main(void) {

    int a = 1;


     while(a > 0) {
           printf("%d\n", a);
     }

 

     return 0;
}

 

컴파일러는 이 코드를 컴파일하면서, while(a > 0) 은 항상 참이 되기 때문에 아래와 같이 바꿔버립니다.

 

int main(void) {

    int a = 1;

 

    while(1) { // 항상 참

        printf("%d\n", a);

    }

 

    return 0;

}

 

비교 연산을 하나라도 줄이면 실행 파일의 크기는 물론 실행 시간도 줄일 수 있기 때문이죠.

그런데 a 변수가 조금 특별해서, 코드에서는 바꾸지 않았지만 외적 요인에 의해(다른 프로그램이 바꾸는 등) 값이 변할 수 있어서 항상 a과 0을 비교할 필요가 있을 때는, volatile 연산자를 붙여주어서 '코드에는 없지만 외부에서 이 변수의 값을 바꿀 가능성이 있다'라는 것을 컴파일러에 알려줍니다. 그러면 컴파일러는 위와 같이 함부로 최적화하지 않습니다. 즉,

 

int main(void) {

    volatile int a = 1;


     while(a > 0) {
           printf("%d\n", a);
     }

 

     return 0;
}

 

같이 프로그램을 작성하면, while의 조건식은 절대 컴파일러가 바꾸지 않으므로 무조건 a > 0 이 되고,

무한 루프를 돌 때마다 a 값을 계속 비교한다는 의미입니다.

 

일반적으로 volatile 을 쓸 일은 없지만, 멀티 스레드 프로그래밍이라는 것을 할 때에는 필요한 부분입니다.

 

 

 

 

출처 : 

kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=150820310

'Programming Language > C Language' 카테고리의 다른 글

C언어) getgid() 함수  (0) 2021.06.16
C언어) 파일 디스크립터(FD, File Descriptor)  (0) 2021.06.15
C언어) read() 함수  (0) 2021.06.15
C언어) open() 함수  (0) 2021.06.15
C언어) strstr() 함수  (0) 2021.06.15

+ Recent posts