1、 字符讀寫文件流
l fgetc(由文件中讀取一個字符——字符讀寫文件流)
相關函數 open,fread,fscanf,getc
表頭文件 include <stdio.h>
定義函數 int fgetc(FILE *stream);
函數說明 fgetc()從參數stream所指的文件中讀取一個字符。若讀到文件尾而無數據時便返回EOF。
返回值 getc()會返回讀取到的字符,若返回EOF則表示到了文件尾。
範例
#include <stdio.h>
main()
{
FILE *fp;
int c;
fp = fopen(“exist”,”r”);
while((c=fgetc(fp))!=EOF)
printf(“%c”,c);
fclose(fp);
}
l getc(由文件中讀取一個字符)
相關函數 read,fopen,fread,fgetc
表頭文件 #include<stdio.h>
定義函數 int getc(FILE * stream);
函數說明 getc()用來從參數stream所指的文件中讀取一個字符。若讀到文件尾而無數據時便返回EOF(-1)。雖然getc()與fgetc()作用相同,但getc()爲宏定義,非真正的函數調用。
返回值 getc()會返回讀取到的字符,若返回EOF則表示到了文件尾。
範例 參考fgetc()。
l getchar(由標準輸入設備內讀進一字符)
相關函數 fopen,fread,fscanf,getc
表頭文件 #include <stdio.h>
定義函數 int getchar(void);
函數說明 getchar()用來從標準輸入設備中讀取一個字符。然後將該字符從unsigned char轉換成int後返回。
返回值 getchar()會返回讀取到的字符,若返回EOF則表示有錯誤發生。
附加說明 getchar()非真正函數,而是getc(stdin)宏定義。
範例
#include <stdio.h>
main()
{
FILE * fp;
int c,i;
for(i=0li<5;i++)
{
c=getchar();
putchar(c);
}
}
執行 1234 /*輸入*/
1234 /*輸出*/
l fputc(將一指定字符寫入文件流中)
相關函數 fopen,fwrite,fscanf,putc
表頭文件 #include <stdio.h>
定義函數 int fputc(int c, FILE * stream);
函數說明 fputc 會將參數c 轉爲unsigned char 後寫入參數stream 指定的文件中。
返回值 fputc()會返回寫入成功的字符,即參數c。若返回EOF則代表寫入失敗。
範例 #include <stdio.h>
main()
{
FILE * fp;
char a[26] = ”abcdefghijklmnopqrstuvwxyz”;
int i;
fp= fopen(“noexist”,”w”);
for(i=0;i<26;i++)
fputc(a[i],fp);
fclose(fp);
}
l putc(將一指定字符寫入文件中)
相關函數 fopen,fwrite,fscanf,fputc
表頭文件 #include<stdio.h>
定義函數 int putc(int c,FILE * stream);
函數說明 putc()會將參數c轉爲unsigned char後寫入參數stream指定的文件中。雖然putc()與fputc()作用相同,但putc()爲宏定義,非真正的函數調用。
返回值 putc()會返回寫入成功的字符,即參數c。若返回EOF則代表寫入失敗。
範例 參考fputc()。
l putchar(將指定的字符寫到標準輸出設備)
相關函數 fopen,fwrite,fscanf,fputc
表頭文件 #include<stdio.h>
定義函數 int putchar (int c);
函數說明 putchar()用來將參數c字符寫到標準輸出設備。
返回值 putchar()會返回輸出成功的字符,即參數c。若返回EOF則代表輸出失敗。
附加說明 putchar()非真正函數,而是putc(c,stdout)宏定義。
範例 參考getchar()。
2、 行讀寫文件流
l puts(將字符串寫入標準輸出流stdout)
相關函數 fopen,fread,fscanf,fgets
表頭文件 #include <stdio.h>
定義函數 int *puts(char *s);
函數說明 puts()將s指向的以空字符結尾的字符串(後接換行符,但不寫入終止空字符)寫入標準輸出流stdout。
返回值 puts()若成功則返回非負整數,否則返回EOF。
範例 參考fgets()
#include"stdio.h"
main()
{
static char c[] = "This is just a test\ndhaha…";
puts(c);
}
從程序中可以看出puts函數中可以使用轉義字符,因此輸出結果成爲兩行。puts函數完全可以由printf函數取代。當需要按一定格式輸出時,通常使用printf函數。
l fputs(將一指定的字符串寫入文件內)
相關函數 fopen,fwrite,fscanf,fputc,putc
表頭文件 #include<stdio.h>
定義函數 int fputs(const char * s, FILE * stream);
函數說明 fputs()用來將參數s所指的字符串寫入到參數stream所指的文件內(但不追加換行符,也不寫入終止空字符)。
返回值 若成功則返回寫出的字符個數,返回EOF則表示有錯誤發生。
範例 請參考fgets()。
l gets(從標準輸入設備讀進一字符串)
相關函數 fopen,fread,fscanf,fgets
表頭文件 #include <stdio.h>
定義函數 char * gets(char *s);
函數說明 gets()用來從標準設備讀入字符並存到參數s所指的內存空間,直到出現換行字符或讀到文件尾爲止,最後加上NULL作爲字符串結束。
返回值 gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
附加說明 由於gets()無法知道字符串s的大小,必須遇到換行字符或文件尾纔會結束輸入,因此容易造成緩衝溢出的安全性問題。建議使用fgets()取代。
範例 參考fgets()
#include "stdio.h"
main()
{
char st[15];
printf("input string:\n");
gets(st);
puts(st);
}
可以親自調試一下,當輸入的字符串中含有空格時,輸出仍爲全部字符串。說明gets函數並不以空格作爲字符串輸入結束的標誌,而只以回車作爲輸入結束,這是與scanf函數不同的。
l fgets(由文件中讀取一字符串——行讀寫文件流)
相關函數 open,fread,fscanf,getc
表頭文件 include <stdio.h>
定義函數 char * fgets(char * s, int size, FILE * stream);
函數說明 fgets()用來從參數stream所指的文件內讀入字符並存到參數s所指的內存空間,直到出現換行字符、讀到文件尾或是已讀了size-1個字符爲止,最後會加上NULL作爲字符串結束。
返回值 gets()若成功則返回s指針,返回NULL則表示有錯誤發生。
範例 #include<stdio.h>
main()
{
char s[80];
fputs(fgets(s, 80, stdin), stdout);
}
執行
this is a test /*輸入*/
this is a test /*輸出*/
3、 塊讀寫文件流
l fread(從文件流讀取數據)
相關函數 fopen,fwrite,fseek,fscanf
表頭文件 #include <stdio.h>
定義函數 size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
函數說明 fread()用來從文件流中讀取數據。參數stream爲已打開的文件指針,參數ptr 指向欲存放讀取進來的數據空間,讀取的字符數以參數size*nmemb來決定。fread()會返回實際讀取到的nmemb數目,如果此值比參數nmemb 來得小,則代表可能讀到了文件尾或有錯誤發生,這時必須用feof()或ferror()來決定發生什麼情況。
返回值 返回實際讀取到的nmemb數目。
#include <stdio.h>
int main(int argc, char **argv)
{
struct student{
char name[10];
int number;
};
FILE *fp = NULL;
int i;
struct student boya[2], boyb[2], *pp, *qq;
if(NULL == (fp = fopen("aa.txt", "w+"))){
perror("can not open aa.txt!");
return (-1);
}
pp = boya;
qq = boyb;
printf("please input two students' name and number:\n");
for(i = 0; i < 2; i++, pp++){
scanf("%s\t%d", pp->name, &(pp->number));
}
pp = boya;
fwrite(pp, sizeof(struct student), 2, fp);
rewind(fp);
fread(qq, sizeof(struct student), 2, fp);
printf("name\t\t number\n");
for(i = 0; i < 2; i++, qq++){
printf("%s\t\t %d\n", qq->name, qq->number);
}
fclose(fp);
return (0);
}
執行:
Holy 0
Shit 1
結果:
Name number
Holy 0
Shit 1
l fwrite(將數據寫至文件流)
相關函數 fopen,fread,fseek,fscanf
表頭文件 #include<stdio.h>
定義函數 size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
函數說明 fwrite()用來將數據寫入stream所指定的文件流中。參數stream爲已打開的文件指針,參數ptr 指向欲被寫入的數據地址,總共寫入的字符數以參數size*nmemb來決定。fwrite()會返回實際寫入的nmemb數目。
返回值 返回實際寫入的nmemb數目。
範例 參考fread()。