讀寫函數
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()
讀寫函數