APUE 제5장 표준 IO 라이브러리 part1

3952 단어 apue

5.1 인용문


5.2 흐름 및 FILE 객체


표준 I/O 라이브러리의 경우 스트림(stream) 주위에서 작업을 수행합니다.표준 입출력 라이브러리로 파일을 열거나 만들 때, 우리는 하나의 흐름을 하나의 파일과 결합시켰다.스트림을 열면 표준 입출력 함수 fopen이 FILE 객체에 대한 포인터를 반환합니다.일반적으로 객체는 흐름을 관리하기 위해 입출력 라이브러리에 필요한 모든 정보를 포함하는 구조입니다.
 I/O , , , , 。
#include 
#include 

int fwide (FILE* fp, int mode);
  • 흐르는 방향이 확정되면 fwide 함수는 흐르는 방향을 바꾸지 않습니다.그렇지 않으면 fwide는 흐름의 방향을 설정합니다
  • 모델이 0보다 작으면 흐름이 바이트 방향으로 설정됩니다.mode가 0보다 크면, 흐름은 넓은 방향으로 설정됩니다.
  • 모델이 0이면 방향을 바꾸지 않습니다. 바꾸든지 말든지 되돌아오는 값이 존재합니다. 흐르는 방향을 정하는 데 사용됩니다
  • 5.3 표준 입력, 표준 출력 및 표준 오류


    이 세 가지 표준 I/O 흐름은 미리 정의된 파일 지침인 stdin, stdout, stderr를 통해 인용됩니다.

    5.4 버퍼


    표준 I/O는 세 가지 캐시 유형을 제공합니다.
  • 전체 캐시.이 경우 실제 입출력 작업은 표준 입출력 캐시를 채운 후에야 수행됩니다.
  • 행 캐시.이 경우 표준 I/O 라이브러리는 입력과 출력에 새 행 문자가 나타나면 입출력 작업을 수행합니다.
  • 캐시가 없습니다.표준 I/O 라이브러리는 문자를 캐시하지 않습니다.

  • SVR4와 4.3+BSD 시스템은 기본적으로 다음과 같은 종류의 캐시를 사용합니다. • 표준 오류는 캐시가 없습니다.만약 터미널 장치와 관련된 다른 흐름이라면, 그것들은 행 캐시이다.그렇지 않으면 전체 캐시입니다.
    주어진 흐름 중 하나에 대해 이 시스템의 기본값을 좋아하지 않으면 다음 두 함수 중 하나를 호출하여 캐시 유형을 변경할 수 있습니다.
    #include 
    void setbuf (FILE* fp, void* buf);
    void setvbuf (FILE* fp, void* buf, int mode, size_t size); 

    함수에 자동 변수 클래스의 표준 I/O 캐시를 분배하면 함수에서 되돌아오기 전에 이 흐름을 닫아야 합니다.일반적으로 캐시 길이를 선택하고 캐시를 자동으로 할당해야 합니다.이렇게 처리하면 표준 입출력 라이브러리에서 스트림을 닫을 때 캐시가 자동으로 해제됩니다.언제든지 우리는 하나의 흐름을 강제로 갱신할 수 있다.
    #include
    int fflush (FILE* fp);

    이 함수는 이 흐름의 모든 쓰이지 않은 데이터를 핵으로 전달합니다.fp가 NULL이면 이 함수는 모든 출력 흐름을 새로 고칩니다.

    5.5 흐름 열기

    #include 
    FILE* fopen (const char* pathname, const char* mode);
    FILE* freopen (const char* pathname, const char* mode, FILE* fp);
    // : 、 。
    FILE* fdopen (int fd, const char* mode);
    // 。

    type 매개 변수는 입출력 흐름에 대한 읽기, 쓰기 방식을 지정합니다. ANSI C에서는 type 매개 변수에 15가지 다른 값을 지정할 수 있습니다.
    주의: a+ 또는 a 방식으로 파일을 열 때, 매번 읽기 전에, 파일 테이블 항목의 현재 파일 편이량을inode의 파일 길이로 설정합니다.
    fdopen에서 type 매개 변수의 의미는 약간 다르다.
  • 이 설명자가 열려 있기 때문에 type의 수치는 설정된 파일 상태 표시에 제한됩니다.
  • #include 
    #include 
    #include 
    
    int main(int argc, char* argv[]){
        int fd = open (argv[1], O_RDONLY); //  
        char buf[BUFSIZ] = "HELLOWORLD";
        write(fd, buf, 10);
        FILE* fp = fdopen(fd,"w"); // fd   NULL 
        if (fp)
           fprintf(stdout, "succeed to  fdopen %s 
    ", argv[1]); else fprintf(stdout, "fail to fdopen %s
    ", argv[1]); fclose(fp); return 0; } print "fail to fdopen"
  • 파일 상태 플래그에 관계 없음 OTRUNC가 설정되어 있는지 여부입니다. fdopen이 쓰기 위해 열면 이 파일이 짧아지지 않습니다. ("w+"는 잘못되었지만 오류를 되돌려주지 않습니다.)
  • int main(int argc, char* argv[]){
        int fd = open (argv[1], O_RDWR | O_TRUNC);
        char buf[BUFSIZ] = "HELLO WORLD";
        write(fd, buf, 11);
        FILE* fp = fdopen(fd,"w+");
        putc('c',fp);
        if (fp)
           fprintf(stdout, "succeed to  fdopen %s 
    ", argv[1]); else fprintf(stdout, "fail to fdopen %s
    ", argv[1]); fclose(fp); return 0; } // "HELLO WORLDc", “c”

    읽기와 쓰기 형식으로 파일을 열 때 (type 중 + 번호) 다음과 같은 제한이 있습니다. • 중간에 fflush, fseek, fsetpos,rewind가 없으면 출력 뒤에 입력을 직접 따라갈 수 없습니다. •만약 중간에 fseek, fsetpos,rewind가 없거나 출력 작업이 파일 끝에 도착하지 않았다면 입력 작업 후에 출력을 직접 따라갈 수 없습니다.
    int main(int argc, char* argv[]){
        FILE* fp = fopen(argv[1],"r+");
        char ch = fgetc(fp);
        fputc(ch, fp);
        return 0;
    }
    //  , , linux 3.10.0、 gcc 4.8.3   ??  

    w나 a 형식을 지정하여 새 파일을 만들 때, 이 파일의 접근 허가 위치를 설명할 수 없습니다. (3장에서 설명한 오픈 함수와creat 함수는 이 점을 할 수 있습니다.)POSIX.1 이러한 방식으로 생성된 파일에는 다음과 같은 액세스 권한이 필요합니다. SIRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH. 그러나umask값을 통해 이 권한을 제한할 수 있습니다.

    좋은 웹페이지 즐겨찾기