1. 程式人生 > >Chapter5-標準I/O庫(補充)-「APUE讀書筆記」

Chapter5-標準I/O庫(補充)-「APUE讀書筆記」

  • 實現

每個標準I/O流都有一個相關聯的檔案描述符,可以用fileno函式來獲取。

#include<stdio.h>

int    fileno(FILE*  fp);           //POSIX支援的擴充套件,函式dup和fcntl需要此函式

one line to standard error
stream = stdin, line buffered, buffer size = 1024
stream = stdout, line buffered, buffer size = 1024
stream = stderr, unbuffered, buffer size = 1
stream = /etc/passwd, fully buffered, buffer size = 4096
由範例可看出流連線到終端時是行緩衝

而當流定向到檔案時

stream = stdin, fully buffered, buffer size = 4096
stream = stdout, fully buffered, buffer size = 4096
stream = stderr, unbuffered, buffer size = 1
stream = /etc/passwd, fully buffered, buffer size = 4096
流變為了全緩衝,標準錯誤仍然不帶緩衝
  • 臨時檔案

#include<stdio.h>

char*    tmpnam(char*  ptr);          //返回路徑

FILE*    tmpfile();                           //返回檔案指標,錯誤返回NULL

tmpnam產生的路徑放在靜態區,若需多次使用該路徑應該儲存路徑副本,重複呼叫tmpnam會覆蓋靜態區。

tmp建立臨時二進位制檔案(wb+),在關閉檔案或程式終止時自動刪除。

char name[L_tmpnam], line[MAXLINE];
FILE* fp;
 
printf("%s\n", tmpnam(NULL));
tmpnam(name);
printf("%s\n", name);
FILE* fp2;
if((fp2 = fopen(name, "r+")) == NULL)
  err_sys("fopen error");
if((fp = tmpfile()) == NULL)
  err_sys("tmpfile error");
fputs("one line of output\n", fp);
rewind(fp);
if(fgets(line, sizeof(line), fp) == NULL)
  err_sys("fgets error");
fputs(line, stdout);  
輸出
/tmp/fileC9o7x4
/tmp/fileojVsqW
fopen error: No such file or directory

可以看到tmpnam產生的路徑名已經不能再開啟,因為使用tmpnam後會立即unlink它(解除連結而不刪除內容)。

同時在編譯時有如下提示

/tmp/cc57tA4p.o:在函式‘main’中:
5.13.cpp:(.text+0x21): 警告: the use of `tmpnam' is dangerous, better use `mkstemp'
事實上XSI擴充套件部分定義了另外兩個函式mkdtemp和mkstemp

char*    mkdtemp(char*  template);       //成功返回目錄路徑,出錯返回NULL

int    mkstemp(char*  template);            //成功返回檔案描述符,出錯返回-1

template是後6位設定為XXXXXX的路徑名,函式將佔位符替換成隨機字元來構建檔名或目錄名。

mkstemp返回檔案描述符並以讀寫方式開啟,而且不同於tempfile,此臨時檔案並不會自動刪除。

tmpnam和tempnam在返回路徑名和建立檔案間有時間差,在這之間該路徑名可能被佔用,所以推薦使用tmpfile和mkstemp。

  • 記憶體流

建立記憶體流的函式

#include<stdio.h>

FILE*    fmemopen(void*  restrict  buf,  size_t  size,  const  char*  restrict  type);

成功返回流指標,錯誤返回NULL。buf為空時,分配size位元組的緩衝,這樣在關閉流時緩衝區被釋放。

以追加方式開啟記憶體流時,當前檔案位置設為緩衝區的第一個null位元組,若沒有則設為緩衝區結尾的後一個位元組。如果不是以追加方式開啟時,當前位置設為緩衝區開始位置。

增加流緩衝區中資料量以及呼叫fclose,fflush,fseek,fseeko,fsetpos都會在當前位置寫入一個null位元組。

還有兩個函式是

#include<stdio.h>

FILE*  open_memstream(char**  bufp,  size_t*  sizep);                     //面向位元組

#include<wchar.h>

FILE*  open_wmemstream(wchar_t**  bufp,  size_t*  sizep);            //面向寬位元組

不同於fmemopen,

  • 這兩個只能以寫開啟
  • 不能指定自己的緩衝區,但可以通過bufp和sizep來訪問緩衝區的地址和大小
  • 關閉流後需手動釋放緩衝區
  • 對流新增位元組會增加緩衝區大小

緩衝區調整後需呼叫fclose或fflush才能生效,並且只在下次寫入或fclose前才有效,因為緩衝區的增長可能重新分配記憶體。記憶體流適合建立字串,把流作為引數用於臨時檔案的函式,可以大大提高效能。

相關推薦

Chapter5-標準I/O補充APUE讀書筆記

實現 每個標準I/O流都有一個相關聯的檔案描述符,可以用fileno函式來獲取。 #include<stdio.h> int    fileno(FILE*  fp);           //POSIX支援的擴充套件,函式dup和fcntl需要此函式 one

C++標準I/O:iostream, fstream, sstringstream

sso www c const ams 生效 系列 linux 引用 binary 在寫代碼的過程中。我們最常做的事就是io操作,不管是對控制臺,還是文件。但一段時間不寫代碼就忘了,這裏理一下C++標準I/O庫的詳細類和操作。 C++的標準I/O庫包含我們常常使用的io

C 標準I/O粗略實現

介紹 功能 問題: 關系 請求 頻繁 determine 不出 tin 本文同時發表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/123 寫一下fopen/getc/putc等C庫的粗略實現,參考

java I/O總結

roc rec blob term interface new 數據源 回調 acc File類:即能代表一個特定文件的名稱,又能代表一個目錄下的一組文件的名稱。File類也可以用來創建新的目錄。File file = new File( "D:/test.txt

Java I/O總結NIO

數據 keys 如果 等待 都是 int har 接口 key I/O的同步異步,阻塞非阻塞:阻塞:當執行的操作所需的數據還沒準備好時,線程進行等待非阻塞:當數據還沒準備好時,線程不等待同步:執行操作,一直等操作執行完才向下執行異步:執行操作,調用接口後不用等待,向下執行常

Unix環境高級編程(三)標準I/O

buffer 文件創建 fop read 通信通道 種類 目的 lose com   標準I/O庫是ISO C的標準,在很多操作系統上面都實現。Unix文件I/O函數都是針對文件描述符的,當打開一個文件的時候,返回該文件描述符用於後續的I/O操作。而對於標準I/O庫,操作

C++標準I/O

流介紹 標準I/O類的標頭檔案    <iostream>  包含istream、ostream、iostream這三個類。其中,iostream由istream和ostream派生而來。

java基礎之I/O-------轉換流

一.轉換流的概念: 轉換流即包裝流,可以使位元組流轉換成字元流,也可以字元流轉成位元組流。         二.位元組流轉字元流:                    1.InputStreamReader 是位元組流通向字元流的橋樑:它使用指定的 charset

I/O3

三、字元流 1.Reader和Writer抽象類    位元組流提供處理任何型別輸入/輸出操作的足夠功能,但不能直接操作Unicode字元,因而需要字元流(主要用於檢視檔案內容),字元流層次結構的頂層是Reader和Writer抽象類。 (1)Reader是定義Java

APUE第5章 標準I/O

1、概述 標準I/O庫處理很多細節,如緩衝區分配、以優化的塊長度執行I/O等。這些處理使使用者不必擔心如何選擇使用正確的長度。本章深入瞭解I/O庫函式的操作。 2、流和FILE物件 對於所有I/O函式(見第3章)都圍繞檔案描述符的。當開啟一個檔案時,即返回一個檔案描述符

標準I/O

tel 下一個 相關 chat 寫入 使用 進制 set lose 設置流的定向: #include <stdio.h> #include <wchar.h> // 流的定向決定了所讀、寫的字符是單字節(字節定向)還是多字節的(寬定向) // 若

Unix/Linux程式設計-標準I/O

標準I/O庫 2.1 標準輸入、標準輸出和標準錯誤 程序中預定義了這3個流,可以自動地被程序呼叫。這些流引用的檔案與檔案描述符中的STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO所引用的相同。這3個標準I/O流通過預定義檔案指標stdin、stdou

嵌入式Linux應用程式設計之I/O程序

【1】i/o 本質就是輸入輸出函式,也是讀寫函式 【2】系統呼叫和庫函式 系統呼叫: 使用函式控制linux核心,linux核心來操作硬體 庫函式: 庫函式的本質還是系統呼叫,只不過需要在記憶體當中開闢一塊空間(緩衝區),從而減少系統呼叫的次數 【3】io分類

手把手教你玩轉SOCKET模型之重疊I/O

手把手教你玩轉SOCKET模型之重疊I/O篇 “身為一個初學者,時常能體味到初學者入門的艱辛,所以總是想抽空作點什麼來盡我所能的幫助那些需要幫助的人。我也希望大家能把自己的所學和他人一起分享,不要去鄙視別人索取時的貪婪,因為最應該被鄙視的是不肯付出時的吝嗇。” -----

APUE標準I/O

本文章說明標準I/O庫1.流和FILE物件 對於檔案IO都是針對於檔案描述符的,但是對於標準I/O,則是針對於流進行的 當用標準I/O庫開啟一個檔案的時候,我們已使一個流和一個檔案相關聯 對於ASCII字符集,一個字元用一個位元組表示,對於國際字元,一個字元可用多個位元組表示 標準I/O檔案流可用於單

淺析C標準I/O

1: void streaming_property(FILE* file) <!--CRLF--> 2: { <!--CRLF--> 3: <!--CRLF--> 4: if(file->_flags & _IO_

Java——I/O學習

Java I/O學習(一)什麼是I/O?I/O就是資料輸入輸出資料流,也稱作資料流。Java I/O操作主要指的是使用Java進行輸入、輸出操作,Java中的所有操作類都存放在Java.io包中,在使用時需要匯入此包。在整個Java.io包中最重要的就是5個類和1個介面,這5

5.9 標準I/O_二進位制I/O

    下列兩個函式執行二進位制I/O操作: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fwri

UNIX環境高階程式設計學習之路(三)----標準I/O

#include <stdio.h> #include <wchar.h> int fwide(FILE *fp, int mode); 返回值:若流是寬定向的,返回 正值;若流是位元組定向的,返回負值;若流是未定向的,返回0;</pre></div><

java基礎之I/O------------字元流的檔案讀寫操作

一.流的概念: java的輸入輸出稱為流,流是一組有順序的集合。而流的本質則是資料傳輸 二.流的分類:                  1.根據處理的功能分為位元組流(InputStream,OutPutStrean)和字元流(Writer,Reader)