C함수 파일 읽기

read() 함수

 

open() 함수로 열기를 한 파일의 내용을 읽기를 합니다.

  • 헤더: unistd.h
  • 형태: ssize_t read (int fd, void *buf, size_t nbytes)
  • 인수: int fd 파일 디스크립터
           void *buf 파일을 읽어 들일 버퍼
           size_t nbytes 퍼버의 크기
  • 반환: ssize_t -1 == 실패, 정상적으로 실행되었다면 읽어들인 바이트 수

 

예제

예제에 사용할 test.txt 파일에는 아래와 같이 5바이트씩 문장이 입력되어 있습니다.

12345
ABCDE
abcde
67890

 

표준 출력함수 fgets() 에는 버퍼가 크더라도 파일의 첫 번째 행만 읽어서 반환하지만 read()는 버퍼의 크기만큼 읽을 수 있다면 모두 읽어 들입니다. 그러므로 read()에서 사용할 버퍼의 크기가 파일 보다 크다면 파일의 모든 내용을 읽어 들이게 됩니다.

 

아래는 test.txt의 파일 내용보다 버퍼의 크기가 1024로 크기가 크므로 한번에 읽기를 해서 파일의 모든 내용을 출력하는 예제입니다.

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

#define  BUFF_SIZE   1024

int main()
{
   char   buff[BUFF_SIZE];
   int    fd;

   if ( 0 < ( fd = open( "./test.txt", O_RDONLY))){
      read( fd, buff, BUFF_SIZE);
      puts( buff);
      close( fd);
   } else {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}

 

출력

$ a.out
12345
ABCDE
abcde
67890
$

 

만일 파일 내용보다 버퍼 크기가 작다면 여러번 읽기를 시도할 수 있습니다.

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

#define  BUFF_SIZE   5     // 버퍼의 크기가 작습니다.

int main()
{
   char     buff[BUFF_SIZE];
   int      fd;
   ssize_t  rd_size;

   if ( 0 < ( fd = open( "./test.txt", O_RDONLY))){
      while( 0 < ( rd_size = read( fd, buff, BUFF_SIZE-1))){  //  4 byte씩 읽씁니다.
         buff[rd_size]  = '\0';      // puts()를 위해 NULL을 대입
         puts( buff);
      }
      close( fd);
   } else {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}

 

출력

$ a.out
1234
5
AB
CDE

abcd
e
67
890
$

 

 

참고 :

https://badayak.com/4486?category=887532

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

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

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

앱을 배포하기 위해선 (플레이스토어에 등록하기 위해선) apk 에 꼭 서명을 해야한다. 키스토어를 생성, 앱에 서명을 해 서명된 apk와 jks 파일을 획득하는 과정과 keytool을 사용해 서명된 앱과 키스토어 파일에서 서명값을 확인하는 방법을 알아본다.

 

키스토어 생성 / 앱에 서명 / 서명된 apk 획득

안드로이드 스튜디오의 Build>Generate Signed Bundle / APK... 를 클릭한다.

 

 

 

 

 

그리고 APK를 체크한 후 Next를 클릭한다.

 

 

 

 

 

키스토어를 생성하기 위해 Create new를 클릭한다. 키스토어 파일은 인증서라고 생각하면 된다.

 

 

 

 

 

Key store path에서 아래 네모박스의 열기버튼을 클릭한다.

 

 

 

 

 

키스토어를 생성할 경로를 선택한 뒤 FileName에 파일명을 입력해준다.

 

 

 

 

 

 

 

 

그리고 나머지 항목들을 채워준 후 OK를 눌러준다. 특히 키스토어 파일도 마찬가지이긴 하지만 비밀번호는 절대 잊어버리면 안되므로 꼭 기억해둔다.

 

 

 

 

 

그럼 아래와 같이 이전 화면으로 돌아오고 필요한 항목들은 자동으로 다 채워진다. Next를 클릭한다.

 

 

 

 

 

realse를 선택한 후 Signature Versions에서 V1과 V2를 전부 체크해 Jar와 APK에 전부 서명할 것임을 명시하고 Finish를 눌러준다.

 

 

 

 

 

몇분정도 지나면 'Generate Signed APK' 창이 뜬다.

 

 

 

 

 

그리고 아래와 같이 서명된 app-relase apk 파일을 볼 수 있다.

 

 

 

 

 

앱 서명 / 키 서명 확인

앱에 서명하는 과정을 진행해보았는데, 반대로 서명된 앱을 구했을 때 앱의 서명을 확인하고 싶을 수도 있을 것이다. (자바 jdk가 설치되어 있고 자바 환경변수도 등록되어 있다는 가정 하에 진행하자면) %JAVA_HOME%bin 에 keytool.exe가 있다.

 

 

 

 

 

앱의 서명값을 확인하려면 아래와 같이 keytool을 사용한다.

 


keytool.exe -printcert -jarfile [apk]

 

 

 

 

 

키의 서명값을 확인하려면 아래와 같이 keytool을 사용한다.

 


keytool.exe -list -v -keystore [jks]

 

 

 

 

 

출처 :

liveyourit.tistory.com/158

<permission> 속성

 

구문

<permission android:description="string resource"
                android:icon="drawable resource"
                android:label="string resource"
                android:name="string"
                android:permissionGroup="string"
                android:protectionLevel=["normal" | "dangerous" |
                                         "signature" | ...] />

 

포함된 요소

 

<manifest>

 

설명

 

이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데 사용될 수 있는 보안 권한을 선언합니다. 권한 작동 방식에 관한 자세한 내용은 소개의 권한 섹션과 보안 및 권한 문서를 참조하세요.

 

속성

 

android:description

 

권한에 관한 사용자가 읽을 수 있는 설명으로 라벨보다 길고 더 많은 정보를 제공합니다. 사용자에게 다른 애플리케이션에 권한을 부여할지 여부를 묻는 등 사용자에게 권한을 설명하기 위해 표시될 수 있습니다.

이 속성은 문자열 리소스의 참조로 설정해야 하며 label 속성과 달리 원시 문자열일 수 없습니다.

 

 

android:icon

 

권한을 나타내는 아이콘의 드로어블 리소스의 참조입니다.

 

 

android:label

 

권한 이름으로, 사용자에게 표시될 수 있습니다.

애플리케이션을 개발하는 동안 편의를 위해 라벨을 직접 원시 문자열로 설정할 수 있습니다. 그러나 애플리케이션을 게시할 준비가 되면 사용자 인터페이스의 다른 문자열처럼 현지화할 수 있도록 라벨을 문자열 리소스의 참조로 설정해야 합니다.

 

 

android:name

 

권한 이름입니다. 코드에서 권한을 참조하는 데 사용될 이름입니다(예: <uses-permission> 요소 및 애플리케이션 구성요소의 permission 속성).

 

( 참고: 모든 패키지가 동일한 인증서로 서명되지 않으면 여러 패키지가 이름이 동일한 권한을 선언할 수 없습니다. 패키지에서 권한을 선언하면 이러한 패키지가 첫 번째 패키지와 동일한 인증서로 서명되지 않는 한 사용자가 동일한 권한 이름으로 다른 패키지를 설치할 수 없습니다. 이름 충돌을 피하려면 맞춤 권한에 역 도메인 스타일 이름 지정(예: com.example.myapp.ENGAGE_HYPERSPACE)을 사용하는 것이 좋습니다. )

 

 

android:permissionGroup

 

그룹에 이 권한을 할당합니다. 이 속성의 값은 그룹의 이름으로, 이 애플리케이션이나 다른 애플리케이션에 <permission-group> 요소로 선언되어야 합니다. 이 속성을 설정하지 않으면 권한이 그룹에 속하지 않습니다.

 

 

android:protectionLevel

 

권한에 내포된 잠재적 위험을 특성화하고 권한을 요청하는 애플리케이션에 권한을 부여할지 여부를 결정할 때 시스템에서 따라야 하는 절차를 나타냅니다.

 

각 보호 수준은 기본 권한 유형과 0개 이상의 플래그로 구성됩니다. 예를 들어 "dangerous" 보호 수준에는 플래그가 없습니다. 반면 보호 수준 "signature|privileged"는 "signature" 기본 권한 유형과 "privileged" 플래그의 조합입니다.

 

 

 

다음 표에서는 모든 기본 권한 유형을 보여줍니다. 플래그 목록은 protectionLevel을 참조하세요.

'normal' 기본값입니다. 다른 애플리케이션, 시스템, 사용자의 위험을 최소화하면서 권한을 요청하는 애플리케이션에 격리된 애플리케이션 수준 기능에 대한 액세스 권한을 제공하는 위험성이 낮은 권한입니다. 시스템에서는 사용자의 명시적인 승인을 요구하지 않고 설치 시 권한을 요청하는 애플리케이션에 이러한 유형의 권한을 자동으로 부여합니다. 하지만 사용자는 설치 전에 항상 이러한 권한을 검토할 수 있습니다.
'dangerous' 권한을 요청하는 애플리케이션에 비공개 사용자 데이터에 대한 액세스 권한 또는 사용자에게 부정적인 영향을 줄 수 있는 기기 제어 권한을 부여하는 위험성이 높은 권한입니다. 이러한 유형의 권한은 잠재적인 위험을 초래하므로 시스템에서 권한을 요청하는 애플리케이션에 권한을 자동으로 부여하지 않을 수 있습니다. 예를 들어 애플리케이션에서 위험한 권한을 요청하면 사용자에게 표시하고 계속 진행하기 전에 확인을 요청하거나 사용자가 이러한 기능의 사용을 자동으로 허용하지 않도록 기타 다른 접근 방식을 취할 수 있습니다.
'signature' 권한을 요청하는 애플리케이션이 권한을 선언한 애플리케이션과 동일한 인증서로 서명한 경우에만 시스템에서 부여하는 권한입니다. 인증서가 일치하면 시스템에서는 사용자에게 알리거나 사용자의 명시적인 승인을 요청하지 않고 자동으로 권한을 부여합니다.
'signatureOrSystem'

"signature|privileged"의 이전 동의어로, API 레벨 23에서 지원이 중단되었습니다.

Android 시스템 이미지의 전용 폴더에 있는 애플리케이션 또는 권한을 선언한 애플리케이션과 동일한 인증서로 서명된 애플리케이션에만 부여되는 권한입니다. signature 보호 수준은 대부분의 요구사항에 부합하며 앱이 설치된 정확한 위치와 관계없이 작동하므로 이 옵션은 사용하지 않는 것이 좋습니다. 여러 공급업체가 시스템 이미지에 빌드된 애플리케이션을 보유하고 이러한 애플리케이션이 함께 빌드되어 특정 기능을 명시적으로 공유해야 하는 특수한 상황에서 'signatureOrSystem' 권한이 사용됩니다.

 

 

 

출처 :

developer.android.com/guide/topics/manifest/permission-element?hl=ko

 

 

최근에 Android Studio v0.1.1을 사용하기 시작했으며 LogCat을 찾을 수 없는 것 같습니다. 사라졌습니까? 그렇지 않은 경우 어떻게 활성화 할 수 있습니까?

 

그것이 사라지면 비슷한 방식으로 내 앱 동작을 기록하고 주로 충돌하는 방법이 있습니까?


내 설치 0.1.1에서 여전히 logcat을 찾을 수 있다고 생각합니다.

 

Windows에서 + 또는 Mac에서 Alt+ 6를 눌러보십시오 .CMD6


숨겨져 있는지 확인하십시오 ... Alt+ 6를 사용 하여 창을 열고 '로그 캣보기 복원'아래 표시된 버튼을 클릭하십시오


Alt + 6을 눌러 표시 할 수 있습니다

 

 

 

출처 :

lottoking.tistory.com/1244

+ Recent posts