1. 程式人生 > >【APUE】標準I/O庫

【APUE】標準I/O庫

本文章說明標準I/O庫
1.流和FILE物件
對於檔案IO都是針對於檔案描述符的,但是對於標準I/O,則是針對於流進行的
當用標準I/O庫開啟一個檔案的時候,我們已使一個流和一個檔案相關聯
對於ASCII字符集,一個字元用一個位元組表示,對於國際字元,一個字元可用多個位元組表示
標準I/O檔案流可用於單位元組或多位元組字符集
流的定向決定了所讀、寫的檔案是單位元組還是多位元組的,當一個流被建立的時候,它沒有被定向
如果在沒有定向的流中使用多位元組的I/O函式,則將該流的定向設定為寬定向的
如果在沒有定向的流中使用單位元組的I/O函式,則將該流的定向設定為位元組定向
fwide函式可以設定流的定向
#include <stdio.h>
#include <fchar.h>
int fwide(FILE *fp, int mode);
//若流是寬定向的返回正值,若流是位元組定向的返回負值,若流是未定向的返回0
若mode是正值,則函式試圖設定流為寬定向的
若mode是負值,則函式試圖設定流為位元組定向的
若mode是0,則函式不設定流的定向,但是將返回標識該流定向的值
注意fwide函式不設定已經定向的流

2.標準輸入,標準輸出和標準錯誤輸出

在<stdio.h>中定義了這三個流stdin, stdout, stderr
這三個流可以自動地被程序使用

3.緩衝
標準I/O提供緩衝是為了儘量減少read和write函式的呼叫
標準I/O提供了三種類型的I/O
(1)全緩衝
當緩衝區全部寫滿的時候在進行寫入操作。
(2)行緩衝
當遇到換行符的時候進行寫入操作,或者遇到換行符之前,緩衝區填滿也進行寫入
(3)不緩衝

ISO C要求下列緩衝特性:
當且僅當標準輸入輸出不涉及互動式裝置的時候,它們才是全緩衝的
標準出錯決不是全緩衝的
很多系統預設下列型別的緩衝特性:
標準出錯不帶緩衝
如若是涉及終端裝置的其他流的時候,則它們是行緩衝的,否則是全緩衝的
可以呼叫下面兩個函式更改緩衝型別:
#include <stdio.h>
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
//成功返回0,出錯返回非零值
setbuf函式中,若buf非空,buf長度為BUFSIZ,則緩衝型別是全緩衝或者行緩衝,當buf為NULL的時候不緩衝
setvbuf函式中,不同的mode有不同的處理方式
_IOFBF 全緩衝,buf如下
當buf非空,緩衝區為長度為size的使用者buf
當buf為BULL的時候,緩衝區為合適長度的系統緩衝區
_IOLBF 行緩衝,buf同理
_IONBF 不緩衝,buf和size忽略
強制沖洗一個流,將未寫入的資料都傳送給核心
#include <stdio.h>
int ffush(FILE *fp);
//成功返回0,出錯返回EOF

4.開啟流

開啟一個標準I/O流
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
//開啟一個指定的檔案
FILE *freopen(const char *restrict pathname, const char *restrict type, FILR *restrict fp);
//在一個指定的流上開啟一個指定的檔案,如若該流已經開啟,則先關閉該流,若該流已經定向,則清除
FILE *fdopen(int filedesm const char *type);
//將一個現有的檔案描述符與一個標準I/O流結合起來
//以上函式若成功返回檔案指標,失敗返回NULL
type指定對該I/O流的讀寫方式
r或rb 為讀而開啟
w或wb 把檔案截短至0長,或為寫而建立
a或ab 追加,或為寫而建立
r+或r+b或rb+ 為讀和寫而開啟
w+或w+b或wb+ 把檔案截短至0長,或為讀寫而開啟
a+或a+b或ab+ 在檔案尾讀和寫而開啟或建立
b作為type的一部分為了區分文字檔案和二進位制檔案,但是UNIX系統並不區分這兩種型別的檔案,在UNIX下b是無用的
fdopen在為寫而開啟的時候並不截短檔案

當以讀和寫型別開啟一個檔案的時候,有以下限制:
如果中間沒有fflush、fseek、fsetpos和rewind的時候,則在輸出後面不能直接跟隨輸入
如果中間沒有fseek、fsetpos或rewind,或者一個輸入操作沒有達到檔案尾端,在輸入操作之後不能跟隨輸出

呼叫fclose關閉一個開啟的流
#include <stdio.h>
int fclose(FILE *fp);
//成功返回0,出錯返回EOF

5.讀和寫流

以下三個函式用於一次讀一個字元
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);//等價與getc(stdin);
//成功返回下一個字元,達到檔案尾或出錯返回EOF
為了區分是否達到檔案尾還是出錯,有以下函式
#include <stdio.h>
int ferror(FILE *fp);
int feof(FILE *fp);
//若條件為真,返回非零值,否則返回0
void clearerr(FILE *fp);//清除這兩個標誌
可以呼叫下面的函式將已經讀出來的字元壓送會流中
#include <stdio.h>
int ungetc(int c, FILE *fp);
//成功返回c,失敗返回EOF
使用這個函式時,字元送到了流的緩衝區中
輸出函式
#include <stdio.h>
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
//成功返回buf,出錯返回EOF

6.每次一行I/O

下面函式提供每次輸入一行的函式
#include <stdio.h>
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
//成功返回buf,到達檔案尾或失敗返回EOF
//gets函式不安全,不建議使用
每次輸出一行:
#include <stdio.h>
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);
//成功返回非負值,出錯返回EOF

7.二進位制I/O
執行二進位制I/O的操作
#include <stdio.h>
size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
//返回讀和寫的物件數
//nobj為讀寫的物件數

8.格式化I/O
格式化輸出函式
#include <stdio.h>
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict fp, const char *restrict format, ...);
//成功返回輸出的字元數,失敗返回負值
int sprintf(char *restrict buf, const char *restrict format, ...);
int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);
//成功返回存入陣列的字元數,失敗返回負值
printf格式化寫到標準輸出
fprintf格式化寫到指定的流
sprintf和snprintf格式化寫到陣列buf中
格式化輸入函式
#include <stdio.h>
int scanf(const char *restrict format, ...);
int fscanf(FILE *restrict fp, const char *restrict format, ...);
int sscanf(const char *restrict buf, const char *restrict format, ...);
//成功返回指定的輸入項數,出錯或者達到了檔案結尾返回EOF

9.實現細節
獲取一個流所對應的檔案描述符
#include <stdio.h>
int fileno(FILE *fp);
//返回與流相關的檔案描述符

10.臨時檔案
建立臨時檔案
#include <stdio.h>
char tmpnam(char *ptr);
//返回唯一路徑名的指標
FILE *tmpfile(void);
//成功返回檔案指標,失敗返回NULL

每次呼叫tmpnam返回一個與檔名不同的有效路徑名字串
tmpfile產生一個臨時的二進位制檔案(wb+)。在關閉該檔案或程式結束的時候將自動刪除這個檔案。

相關推薦

APUE標準I/O

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

APUE第5章 標準I/O

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

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庫的粗略實現,參考

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

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

雜談Java I/O的底層實現

硬盤 字節數 lower jni 處理 裝飾器模式 eight dma 字節數組 前言   Java I/O功能封裝的很好,使用起來很方便,就是剛開始學的時候,如果不了解裝飾器模式,會被他繁多的類給嚇到。用多了也就習慣了,而且現在有很多實用的封裝良好的實用類,可直接讀寫整個

C++標準I/O

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

標準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

系統檔案I/O linux下所有裝置都是以檔案存在的,,可以說是一切皆檔案,所以當我們需要用到這些裝置的時候,首先就需要開啟它們,下面我們來詳細瞭解一下檔案I/O操作。 用到的檔案I/O有以下幾個操作:開啟檔案、讀檔案、寫檔案、關閉檔案等,對應用

淺析C標準I/O

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

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><

標準I/O(五)

前言 UNIX一切皆檔案,掌握檔案的操作尤其重要。以下的內容主要是apue上面第五章內容,介紹了標準I/O庫的一些內容。 流和FILE物件 標準I/O庫,他們的操作都是圍繞流進行的 字元分為單位元組和多位元組,流的定向決定了是所讀、寫的字元是單位

標準I/O 筆記

標準I/O庫 1.流和FILE物件 a) ASCII字符集:一個字元用一個位元組表示 b) 國際字元:一個字元可以用多個位元組表示 c) 標準I/O檔案流可以用於單位元組或者多位元組字符集 2.流定向 a) 決定所讀、寫的字元是單位元組或者是多位元組 b) 流最初建立時無

第五章 標準I/O

本章講述的是標準I/O庫的很多細節,如緩衝區的分配、以優化的塊長度執行I/O等,因為有這些處理,讓我們不必擔心如何選擇正確的塊長度。 5.2 流和FILE物件 1.流定向決定了所讀、寫的字元是單位元組還是多位元組。當一個流最初被建立時,它並沒有定向。如

C++標準I/0錯誤:runtime_error was not declared

# 編譯出現:runtime_error was not declared #include <iostream> //#include <stdexcept> //runtime_error using namespace std; std

APUE第3章 文件I/O (3) 文件共享、原子操作、函數dup/dum2、函數sync/fsync/fdatasync、函數fcntl、函數ioct1、目錄/dev/fd 使用說明

src 技術分享 fsync 表之間 eight 進程 所有 修改 數據塊 1、文件共享 UNIX系統支持在不同的進程間共享打開文件。為了說明這種共享,以下介紹內核用於所有I/O的數據結構。 內核使用3種數據結構表示打開文件,它們之間的關系決定了在文件共享方面一個進程對

Oracle oracle數據的並發初步理解

數據交互 空閑 details cti 但是 art 網速慢 可見 就會 先從一個列子來說:我們經常聽到說某某網站的每天訪問用戶數有幾十,幾千,幾百萬甚至上千萬,同時在線用戶數有幾萬,幾十萬的。從這個列子我們來分析,數據庫並發的概念。首先,這兒有兩個名詞,一個是每天訪問的用