I/O(流)讀寫函數

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表示網絡鏈接出現了問題(對方已經關閉了鏈接)。

相關文章
相關標籤/搜索