1. 程式人生 > >讀寫函數

讀寫函數

printf turn format fstream 讀數 linu 字符數組 put etc

1、getchar()/putchar()

【原 型】int getchar (void); / intfputchar(char c);

【返回值】讀取/寫入字符成功則函數返回值為該字符的ASIIC值,不成功則返回值為EOF。

   getchar() <==>getc(stdin); putchar(char ch) <==>putc(char ch,stdout);

2、getc()/putc() 與fgetc()/fputc()

【頭文件】#include <stdio.h>

【原 型】int fgetc ( FILE * stream ); / int fputc(char ch, FILE* fp);  

     int getc(FILE * stream); / int putc(char ch, FILE* fp);

【功 能】從流中取單個字符 / 寫入一字符到指定流  

【參 數】參數*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; }

3、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。

4、fscanf()/fpintf()

【頭文件】#include <stdio.h>

【原 型】int fscanf(FILE * stream, const char *format, ...);

     int fprintf(FILE * stream, const char * format, ...);

【功 能】fscanf()會自參數stream 的文件流中讀取字符串, 再根據參數format 字符串來轉換並格式化數據。格式轉換形式請參考scanf(). 轉換後的結構存於對應的參數內。 

     fprintf()會根據參數format 字符串來轉換並格式化數據, 然後將結果輸出到參數stream 指定的文件中, 直到出現字符串結束(‘\0‘)為止。 

【返回值】成功則返回輸入/輸出的字符個數, 失敗則返回-1, 錯誤原因存於errno 中。

#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

5、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>
#include <stdlib.h>
int main(void){
    int data = 0;
    FILE *p_fin = NULL;
    FILE *p_fout = NULL;
    p_fin = fopen("file_in.txt", "r");    //以只讀方式打開數據文件
  if(NULL == p_fin){
    printf("error");
    exit(-1);
  }
    p_fout = fopen("file_out.txt", "w");     //以只寫方式打開復制的新文件
    if(NULL == p_fout){
   printf("error");
   exit(-1);
  }
  int r = 0;
while((r = fread(&data, sizeof(char), 1, p_fin)))  //讀數據 fwrite(&data, sizeof(char), r, p_fout);  //寫數據 //關閉文件流 fclose(pfin); fclose(pfout); return 0
; }

6、read()/write()

讀寫函數