getchar()/putchar()——特殊文件指針(stdin/stdout)linux
fgetc()/fputc() 和 getc()/putc()——文件指針(含stdin/stdout)程序員
gets()/puts()——特殊文件指針(stdin/stdout) 數組
fgets()/fputs()——文件指針(含stdin/stdout)網絡
fscanf()/fpintf()——文件指針(含stdin/stdout) 函數
sscanf()/sprintf()——存儲區this
scanf()/printf()——特殊文件指針(stdin/stdout)spa
fread()/fwrite() ——文件指針(含stdin/stdout)指針
read()/write()——文件描述符(含0/1)code
1、字符輸入輸出函數orm
一、getchar()/putchar()
【原 型】int getchar (void); / intfputchar(char c);
【功 能】從標準輸入設備(鍵盤)讀取單個字符 / 寫入一字符到標準輸出設備(屏幕)
【返回值】讀取/寫入字符成功則函數返回值爲該字符的ASIIC值,不成功則返回值爲EOF。
getchar() <==>getc(stdin); putchar(char ch) <==>putc(char ch,stdout);
二、getc()/putc() 與fgetc()/fputc()
【頭文件】#include <stdio.h>
【原 型】int fgetc ( FILE * stream ); / int fputc(char ch, FILE* stream);
int getc(FILE * stream); / int putc(char ch, FILE* stream);
【功 能】從流中讀取單個字符 / 寫入一字符到指定流
【參 數】參數*steam爲要從中讀取/寫入字符的文件流;ch爲要寫入流中的字符。
【返回值】讀取/寫入字符成功則函數返回值爲該字符的ASIIC值,不成功則返回值爲EOF。
【說 明】getc()/putc()與fgetc()/fputc做用相同,但在某些庫中getc()/putc()爲宏定義,而非真正的函數。
#include<stdio.h> #include<string.h> #include<stdlib.h>
int main(void){ int ch, len, i = 0; FILE* fstream; char msg[100] = "Hello!I have read this file."; fstream=fopen("test.txt","at+"); if(fstream==NULL){ printf("read file test.txt failed!\n"); exit(1); } while( (ch = getc(fstream))!=EOF){ /*getc從文件流中讀取字符*/ putchar(ch); } putchar('\n'); len = strlen(msg); while(len>0){ /*循環寫入*/ putc(msg[i],fstream); putchar(msg[i]); len--; i++; } fclose(fstream); return 0; }
2、字符串輸入輸出函數
gets()/puts() 與fgets()/fputs()
【頭文件】#include <stdio.h>
【原 型】char* fgets ( char *str, int size, FILE *fp ); / int fputs(const char *str, FILE *fp);
cahr* gets(char *str); / int puts(const char *str);
【功 能】
char* gets(char *str);
從stdin流中讀取字符串,直至接受到換行符或EOF時中止,將讀取的結果存放在str指針所指向的字符數組中。(不讀取換行符,最後自動添加一個'\0'。,並由此來結束字符串。)
注意:
1. gets函數能夠無限讀取,不會判斷上限,因此程序員應該確保buffer的空間足夠大,以便在執行讀操做時不發生溢出。若是溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值,爲了不這種狀況,咱們能夠用 fgets ( buf, size, stdin )來替換gets()(在linux下,程序中用gets(),編譯會有warning: the `gets' function is dangerous and should not be used)。
2. gets函數能夠接收空格,scanf()不能接受空格。
int puts(const char *str);
puts()函數用來向標準輸出設備(屏幕)寫字符串並換行;注意:puts在輸出字符串後自動換行(自動加‘\n’)。
例1:char a[5]="test"; puts(a);
例2:puts("Hello,C:"); 與 printf("Hello,C:\n"); 二者實現結果相同。
char* fgets ( char *str, int size, FILE *fp );
從fp指定的文件中讀取size-1個字符到str指向的字符數組中。fgets函數讀到‘\n’中止,並讀取‘\n’字符,讀完後再末尾自動加‘\0’字符。fget函數讀取字符無需擔憂超出str置想的數組空間大小問題,它會根據數組的大小自動中止讀取(當讀到size-1個時中止,末尾加‘\0’)。通常用fgets ( buf, size, stdin )從鍵盤讀取字符,推薦使用!!!
int fputs(const char *str, FILE *fp);
將str所指向的字符串寫入到fp中,字符串結束標誌'\0’不寫入。str能夠是字符串數組名,或者是字符串指針。
【返回值】gets()和fgets()成功返回str,出錯或者讀到了末尾返回NULL。
fputs()和puts成功返回非負數,不成功則返回值爲EOF。
3、格式輸入輸出函數
fscanf()/fpintf() 、sscanf()/sprintf 和 scanf()/printf()
【頭文件】#include <stdio.h>
【原 型】int fscanf(FILE * stream, const char *format, ...);
int fprintf(FILE * stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
int sprintf(const char *str, const char *format, ...);
【功 能】fscanf()會自參數stream 的文件流中讀取字符串, 再根據參數format 字符串來轉換並格式化數據。格式轉換形式請參考scanf(). 轉換後的結構存於對應的參數內。
fprintf()會根據參數format 字符串來轉換並格式化數據, 而後將結果輸出到參數stream 指定的文件中, 直到出現字符串結束('\0')爲止。
【返回值】成功則返回輸入/輸出的字符個數, 失敗則返回-1, 錯誤緣由存於errno 中。
【說 明】int fscanf(stdin, const char *format, ...); <==> int scanf(const char *format, ...); 同理,輸出函數也是如此。
#include <stdio.h>
int main(void){ int i = 150, j = -100; double k = 3.14159; fprintf(stdout, "%d %f %x \n", j, k, i); fprintf(stdout, "%2d %*d\n", i, 2, i); //這裏中間的%*d <==> %2d,*被後面的2代替。
return 0; } 執行: -100 3.141590 96
150 150
#include <stdio.h>
int main(void){ int i; unsigned int j; char s[5]; fscanf(stdin, "%d %x %5[a-z] %*s %f", &i, &j, s, s); /*%5[a-z]:表示只接受5個a到z中的字符,%*s:表示跳過下一個字輸入的符串*/ printf("%d %d %s \n", i, j, s); } 執行: 10 0x1b aaaaaaaaa bbbbbbbbbb //從鍵盤輸入
10 27 aaaaa
4、隨機讀寫函數(I/O流操做,對象時緩衝區)
fread()/fwrite()
【原 型】size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
【功 能】fread()從stream讀取nitems個長度爲size的數據到ptr所指向的緩衝區中。返回值是成功讀到緩衝區中的記錄個數。
fwrite()從ptr指向的緩衝區中讀取nitems個長度爲size到數據,並把它們寫到stream所對應的文件中。
【返回值】函數返回的不是讀取/寫入的字節數,而是讀取/寫入的對象數(向下取整)。
【說 明】stream爲用fopen函數返回的文件結構指針。
#include <stdio.h> #inlcude <stdlib.h> #include <string.h>
int main(void){ FILE *p_file = fopen("test.txt", "w+"); /*打開一個文件,沒有就建立*/
if(NULL == p_file){ printf("Failed to open file!"); exit(EXIT_FAILURE); } size_t r = 0; int str[] = {1,2,3,4,5}; int num = 0; char buf[2] = {0}; printf("%lu\n", fwrite(str, sizeof(int), 5, p_file)); /*將數組中的數據寫入到文件*/ rewind(p_file); /*重置文件操做位置(文件開始處)*/
while((r=fread(&num, sizeof(int), 1, p_file))){ /*每次從文件中讀一個sizeof(int)大小的對象*/ sprintf(buf, "%d%c", num, ' '); /*將數據轉換成字符格式*/ fwrite(buf, strlen(buf), r, stdout); /*將字符格式的數據輸出到屏幕*/
//fprintf(stdout, "%d ", num); /*以上兩部可可合併成一步*/
} printf("\n"); fclose(p_file); p_file = NULL; return 0; }
5、文件讀寫函數(基本I/O操做)
read()/write()
【原 型】ssize_t read(int fd,void *buf,size_t nbytes)
ssize_t write(int fd,const void *buf,size_t nbytes)
【功 能】read()從fd指定的文件中讀取nbytes字節數到buf對應的空間中。
write()將buf對應的空間中讀取nbytes個字節到fd指定的文件中。
【返回值】read()
1. 成功時,>0返回read()實際讀的字節數,=0表示已經讀到文件的結束了;<0表示出現了錯誤。
2. 若是錯誤爲EINTR說明讀是由中斷引發的, 若是是ECONNREST表示網絡鏈接出了問題。
write()
1. 成功時,返回write()入字節數;失敗時返回-1,並設置errno變量。
2. 返回的值小於0,此時出現了錯誤,咱們要根據錯誤類型來處理; 若是錯誤爲EINTR表示在寫的時候出現了中斷錯誤;
若是爲EPIPE表示網絡鏈接出現了問題(對方已經關閉了鏈接)。