cppreference.com -> 標准 C I/O ->詳細說明 |
標准 C I/O
clearerr
語法:
#include <stdio.h> void clearerr( FILE *stream ); |
clearerr函數重置錯誤標記和給出的流的EOF指針. 當發生錯誤時,你可以使用perror()判斷實際上發生了何種錯誤.
相關主題: feof(), ferror(), 和perror().
fclose
語法:
#include <stdio.h> int fclose( FILE *stream ); |
函數fclose()關閉給出的文件流, 釋放已關聯到流的所有緩沖區. fclose()執行成功時返回0,否則返回EOF.
相關主題: fopen(), freopen(), 和fflush().
feof
語法:
#include <stdio.h> int feof( FILE *stream ); |
函數feof()在到達給出的文件流的文件尾時返回一個非零值.
相關主題: clearerr(), ferror(), perror(), putc()和 getc().
ferror
語法:
#include <stdio.h> int ferror( FILE *stream ); |
ferror()函數檢查stream(流)中的錯誤, 如果沒發生錯誤返回0,否則返回非零. 如果發生錯誤, 使用perror()檢測發生什么錯誤.
相關主題: clearerr(), feof(), perror(),
fflush
語法:
#include <stdio.h> int fflush( FILE *stream ); |
如果給出的文件流是一個輸出流,那么fflush()把輸出到緩沖區的內容寫入文件. 如果給出的文件流是輸入類型的,那么fflush()會清除輸入緩沖區. fflush()在調試時很實用,特別是對於在程序中輸出到屏幕前發生錯誤片段時. 直接調用 fflush( STDOUT )輸出可以保證你的調試輸出可以在正確的時間輸出.
printf( "Before first call\n" ); fflush( STDOUT ); shady_function(); printf( "Before second call\n" ); fflush( STDOUT ); dangerous_dereference();
相關主題: fclose(), fopen(), fread(), fwrite(), getc(), 和putc().
fgetc
語法:
#include <stdio.h> int fgetc( FILE *stream ); |
fgetc()函數返回來自stream(流)中的下一個字符,如果到達文件尾或者發生錯誤時返回EOF.
相關主題: fputc(), getc(), putc(), 和fopen().
fgetpos
語法:
#include <stdio.h> int fgetpos( FILE *stream, fpos_t *position ); |
fgetpos()函數保存給出的文件流(stream)的位置指針到給出的位置變量(position)中. position變量是fpos_t類型的(它在stdio.h中定義)並且是可以控制在FILE中每個可能的位置對象. fgetpos()執行成功時返回0,失敗時返回一個非零值.
相關主題: fsetpos(), fseek()和 ftell().
fgets
語法:
#include <stdio.h> char *fgets( char *str, int num, FILE *stream ); |
函數fgets()從給出的文件流中讀取[num - 1]個字符並且把它們轉儲到str(字符串)中. fgets()在到達行末時停止,在這種情況下,str(字符串)將會被一個新行符結束. 如果fgets()達到[num - 1]個字符或者遇到EOF, str(字符串)將會以null結束.fgets()成功時返回str(字符串),失敗時返回NULL.
fopen
語法:
#include <stdio.h> FILE *fopen( const char *fname, const char *mode ); |
fopen()函數打開由fname(文件名)指定的文件, 並返回一個關聯該文件的流.如果發生錯誤, fopen()返回NULL. mode(方式)是用於決定文件的用途(例如 用於輸入,輸出,等等)
Mode(方式) | 意義 |
"r" | 打開一個用於讀取的文本文件 |
"w" | 創建一個用於寫入的文本文件 |
"a" | 附加到一個文本文件 |
"rb" | 打開一個用於讀取的二進制文件 |
"wb" | 創建一個用於寫入的二進制文件 |
"ab" | 附加到一個二進制文件 |
"r+" | 打開一個用於讀/寫的文本文件 |
"w+" | 創建一個用於讀/寫的文本文件 |
"a+" | 打開一個用於讀/寫的文本文件 |
"rb+" | 打開一個用於讀/寫的二進制文件 |
"wb+" | 創建一個用於讀/寫的二進制文件 |
"ab+" | 打開一個用於讀/寫的二進制文件 |
示例:
char ch; FILE *input = fopen( "stuff", "r" ); ch = getc( input );
fprintf
語法:
#include <stdio.h> int fprintf( FILE *stream, const char *format, ... ); |
fprintf()函數根據指定的format(格式)(格式)發送信息(參數)到由stream(流)指定的文件. fprintf()只能和printf()一樣工作. fprintf()的返回值是輸出的字符數,發生錯誤時返回一個負值.
示例:
char name[20] = "Mary"; FILE *out; out = fopen( "output.txt", "w" ); if( out != NULL ) fprintf( out, "Hello %s\n", name );
fputc
語法:
#include <stdio.h> int fputc( int ch, FILE *stream ); |
函數fputc()把給出的字符ch寫到給出的輸出流. 返回值是字符, 發生錯誤時返回值是EOF.
相關主題: fgetc(), fopen(), fprintf(), fread(), 和fwrite().
fputs
語法:
#include <stdio.h> int fputs( const char *str, FILE *stream ); |
fputs()函數把str(字符串)指向的字符寫到給出的輸出流. 成功時返回非負值, 失敗時返回EOF.
相關主題: fgets(), gets(), puts(), fprintf(), 和fscanf().
fread
語法:
#include <stdio.h> int fread( void *buffer, size_t size, size_t num, FILE *stream ); |
函數fread()讀取[num]個對象(每個對象大小為size(大小)指定的字節數),並把它們替換到由buffer(緩沖區)指定的數組. 數據來自給出的輸入流. 函數的返回值是讀取的內容數量...
相關主題: fwrite(), fopen(),fscanf(), fgetc()和getc().
freopen
語法:
#include <stdio.h> FILE *freopen( const char *fname, const char *mode, FILE *stream ); |
freopen()函數常用於再分配一個以存在的流給一個不同的文件和方式(mode).在調用本函數后,給出的文件流將會用mode(方式)指定的訪問模式引用fname(文件名). freopen()的返回值是新的文件流,發生錯誤時返回NULL.
fscanf
語法:
#include <stdio.h> int fscanf( FILE *stream, const char *format, ... ); |
函數fscanf()以scanf()的執行方式從給出的文件流中讀取數據. fscanf()的返回值是事實上已賦值的變量的數,如果未進行任何分配時返回EOF.
fseek
語法:
#include <stdio.h> int fseek( FILE *stream, long offset, int origin ); |
函數fseek()為給出的流設置位置數據. origin的值應該是下列值其中之一(在stdio.h中定義):
名稱 | 說明 |
SEEK_SET | 從文件的開始處開始搜索 |
SEEK_CUR | 從當前位置開始搜索 |
SEEK_END | 從文件的結束處開始搜索 |
fseek()成功時返回0,失敗時返回非零. 你可以使用fseek()移動超過一個文件,但是不能在開始處之前. 使用fseek()清除關聯到流的EOF標記.
相關主題: ftell(), rewind(), fopen(), fgetpos()和 fsetpos().
fsetpos
語法:
#include <stdio.h> int fsetpos( FILE *stream, const fpos_t *position ); |
fsetpos()函數把給出的流的位置指針移到由position對象指定的位置. fpos_t是在stdio.h中定義的. fsetpos()執行成功返回0,失敗時返回非零.
相關主題: fgetpos(), fseek()和 ftell().
ftell
語法:
#include <stdio.h> long ftell( FILE *stream ); |
ftell()函數返回stream(流)當前的文件位置,如果發生錯誤返回-1.
fwrite
語法:
#include <stdio.h> int fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); |
fwrite()函數從數組buffer(緩沖區)中, 寫count個大小為size(大小)的對象到stream(流)指定的流. 返回值是已寫的對象的數量.
相關主題: fread(), fscanf(), getc()和 fgetc().
getc
語法:
#include <stdio.h> int getc( FILE *stream ); |
getc()函數從stream(流)獲取並返回下一個字符,如果到達文件尾返回EOF. getc()和fgetc()是一樣的. 例如:
char ch; FILE *input = fopen( "stuff", "r" ); ch = getc( input ); while( ch != EOF ) { printf( "%c", ch ); ch = getc( input ); }
相關主題: fputc(), fgetc(), putc()和 fopen().
getchar
語法:
#include <stdio.h> int getchar( void ); |
getchar()函數從STDIN(標准輸入)獲取並返回下一個字符,如果到達文件尾返回EOF.
相關主題: fputc(), fgetc(), putc()和 fopen().
gets
語法:
#include <stdio.h> char *gets( char *str ); |
gets()函數從STDIN(標准輸入)讀取字符並把它們加載到str(字符串)里,直到遇到新行(\n)或到達EOF. 新行字符翻譯為一個null中斷符. gets()的返回值是讀入的字符串,如果錯誤返回NULL.
相關主題: fputs(), fgetc(),fgets()和 puts().
perror
語法:
#include <stdio.h> void perror( const char *str ); |
perror()函數打印str(字符串)和一個相應的執行定義的錯誤消息到全局變量errno中.
printf
語法:
#include <stdio.h> int printf( const char *format, ... ); |
printf()函數根據format(格式)給出的格式打印輸出到STDOUT(標准輸出)和其它參數中.
字符串format(格式)由兩類項目組成 - 顯示到屏幕上的字符和定義printf()顯示的其它參數. 基本上, 你可以指定一個包含文本在內的format(格式)字符串,也可以是映射到printf()其它參數的"特殊"字符. 例如本代碼
char name[20] = "Bob"; int age = 21; printf( "Hello %s, you are %d years old\n", name, age );
顯示下列輸出:
Hello Bob, you are 21 years old
%s 表示, "在這里插入首個參數,一個字符串." %d 表示第二個參數(一個整數)應該放置在那里. 不同的"%-codes"表示不同的變量類型, 也可以限制變量的長度.
Code | 格式 |
%c | 字符 |
%d | 帶符號整數 |
%i | 帶符號整數 |
%e | 科學計數法, 使用小寫"e" |
%E | 科學計數法, 使用大寫"E" |
%f | 浮點數 |
%g | 使用%e或%f中較短的一個 |
%G | 使用%E或%f中較短的一個 |
%o | 八進制 |
%s | 一串字符 |
%u | 無符號整數 |
%x | 無符號十六進制數, 用小寫字母 |
%X | 無符號十六進制數, 用大寫字母 |
%p | 一個指針 |
%n | 參數應該是一個指向一個整數的指針 指向的是字符數放置的位置 |
%% | 一個'%'符號 |
一個位於一個%和格式化命令間的整數擔當着一個最小字段寬度說明符,並且加上足夠多的空格或0使輸出足夠長. 如果你想填充0,在最小字段寬度說明符前放置0. 你可以使用一個精度修飾符,它可以根據使用的格式代碼而有不同的含義.
- 用%e, %E和 %f,精度修飾符讓你指定想要的小數位數. 例如,
%12.6f
將會至少顯示12位數字,並帶有6位小數的浮點數.
- 用%g和 %G, 精度修飾符決定顯示的有效數的位數最大值.
- 用%s,精度修飾符簡單的表示一個最大的最大長度, 以補充句點前的最小字段長度.
所有的printf()的輸出都是右對齊的,除非你在%符號后放置了負號. 例如,
%-12.4f
將會顯示12位字符,4位小數位的浮點數並且左對齊. 你可以修改帶字母l和h%d, %i, %o, %u和 %x 等類型說明符指定長型和短型數據類型 (例如 %hd 表示一個短整數). %e, %f和 %g 類型說明符,可以在它們前面放置l指出跟隨的是一個double. %g, %f和 %e 類型說明符可以置於字符'#'前保證出現小數點, 即使沒有小數位. 帶%x類型說明符的'#'字符的使用, 表示顯示十六進制數時應該帶'0x'前綴. 帶%o類型說明符的'#'字符的使用, 表示顯示八進制數時應該帶一個'0'前綴.
你可以在輸出字符串中包含 連續的Escape序列.
printf()的返回值是打印的字符數,如果發生錯誤則返回一個負值.
putc
語法:
#include <stdio.h> int putc( int ch, FILE *stream ); |
putc()函數把字符ch寫到stream(流)中. 返回值是寫入的字符, 發生錯誤時返回EOF. 例如:
char ch; FILE *input; input = fopen( "temp.cpp", "r" ); ch = getc( input ); while( ch != EOF ) { printf( "%c", ch ); ch = getc( input ); }
顯示"temp.cpp"的內容到屏幕.
相關主題: fgetc(), fputc(), getchar()和 putchar().
putchar
語法:
#include <stdio.h> int putchar( int ch ); |
putchar()函數把ch寫到STDOUT(標准輸出). 代碼
putchar( ch );
和
putc( ch, STDOUT );
一樣.
putchar()的返回值是被寫的字符, 發生錯誤時返回EOF.
相關主題: putc()
puts
語法:
#include <stdio.h> int puts( char *str ); |
函數puts()把str(字符串)寫到STDOUT(標准輸出)上. puts() 成功時返回非負值, 失敗時返回EOF.
相關主題: putc(), gets()和 printf().
remove
語法:
#include <stdio.h> int remove( const char *fname ); |
remove()函數刪除由fname(文件名)指定的文件. remove()成功時返回0,如果發生錯誤返回非零.
相關主題: rename()
rename
語法:
#include <stdio.h> int rename( const char *oldfname, const char *newfname ); |
函數rename()更改文件oldfname的名稱為newfname. rename()成功時返回0,錯誤時返回非零.
相關主題: remove()
rewind
語法:
#include <stdio.h> void rewind( FILE *stream ); |
函數rewind()把文件指針移到由stream(流)指定的開始處, 同時清除和流相關的錯誤和EOF標記.
相關主題: fseek()
scanf
語法:
#include <stdio.h> int scanf( const char *format, ... ); |
scanf()函數根據由format(格式)指定的格式從stdin(標准輸入)讀取,並保存數據到其它參數. 它和printf()有點類似. format(格式)字符串由控制字符,空白字符和非空白字符組成. 控制字符以一個%符號開始,如下:
控制字符 | 說明 |
%c | 一個單一的字符 |
%d | 一個十進制整數 |
%i | 一個整數 |
%e, %f, %g | 一個浮點數 |
%o | 一個八進制數 |
%s | 一個字符串 |
%x | 一個十六進制數 |
%p | 一個指針 |
%n | 一個等於讀取字符數量的整數 |
%u | 一個無符號整數 |
%[] | 一個字符集 |
%% | 一個精度符號 |
scanf()讀取匹配format(格式)字符串的輸入. 當讀取到一個控制字符, 它把值放置到下一個變量. 空白(tabs, 空格等等)會跳過. 非空白字符和輸入匹配, 然后丟棄. 如果是一個在%符號和控制符間的數量, 那么只有指定數量的字符轉換到變量中. 如果scanf()遇到一個字符集(用%[]控制字符表示), 那么在括號中的任意字符都會讀取到變量中. scanf()的返回值是成功賦值的變量數量, 發生錯誤時返回EOF.
setbuf
語法:
#include <stdio.h> void setbuf( FILE *stream, char *buffer ); |
setbuf()函數設置stream(流)使用buffer(緩沖區),如果buffer(緩沖區)是null,關閉緩沖. 如果使用非標准緩沖尺寸, 它應該由BUFSIZ字符決定長度.
相關主題: fopen(), fclose(), setvbuf(),
setvbuf
語法:
#include <stdio.h> int setvbuf( FILE *stream, char *buffer, int mode, size_t size ); |
函數setvbuf()設置用於stream(流)的緩沖區到buffer(緩沖區),其大小為size(大小). mode(方式)可以是:
- _IOFBF, 表示完全緩沖
- _IOLBF, 表示線緩沖
- _IONBF, 表示無緩存
相關主題: setbuf(),
sprintf
語法:
#include <stdio.h> int sprintf( char *buffer, const char *format, ... ); |
sprintf()函數和printf()類似, 只是把輸出發送到buffer(緩沖區)中.返回值是寫入的字符數量. 例如:
char string[50]; int file_number = 0; sprintf( string, "file.%d", file_number ); file_number++; output_file = fopen( string, "w" );
相關主題: printf(), fsprintf(),
sscanf
語法:
#include <stdio.h> int sscanf( const char *buffer, const char *format, ... ); |
函數sscanf()和scanf()類似, 只是輸入從buffer(緩沖區)中讀取.
tmpfile
語法:
#include <stdio.h> FILE *tmpfile( void ); |
函數tempfile()用一個獨特的文件名打開一個臨時文件,並返回一個到該文件的指針.如果發生錯誤則返回null.
相關主題: tmpnam(),
tmpnam
語法:
#include <stdio.h> char *tmpnam( char *name ); |
tmpnam()函數創建一個獨特的文件名並保存在name中. tmpnam()最多可以調用TMP_MAX指定的次數.
相關主題: tmpfile(),
ungetc
語法:
#include <stdio.h> int ungetc( int ch, FILE *stream ); |
函數ungetc()把字符ch放回到stream(流)中.
相關主題: getc(),
vprintf, vfprintf和 vsprintf
語法:
#include <stdarg.h> #include <stdio.h> int vprintf( char *format, va_list arg_ptr ); int vfprintf( FILE *stream, const char *format, va_list arg_ptr ); int vsprintf( char *buffer, char *format, va_list arg_ptr ); |
這些函數和printf()非常相似, fprintf()和 sprintf()的不同在於參數列表是一個指向一系列參數的指針. va_list在STDARG.H中定義,並且也可以被va_arg()使用. 例如:
void error( char *fmt, ... ) { va_list args; va_start( args, fmt ); fprintf( stderr, "Error: " ); vfprintf( stderr, fmt, args ); fprintf( stderr, "\n" ); va_end( args ); exit( 1 ); }