字符、字符串(行)、塊(文件)讀寫文件流

1、    字符讀寫文件流

l          fgetc(由文件中讀取一個字符——字符讀寫文件流)

相關函數  openfreadfscanfgetc

表頭文件  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(由文件中讀取一個字符) 

相關函數  readfopenfreadfgetc

表頭文件  #include<stdio.h>

定義函數  int getc(FILE * stream);

函數說明  getc()用來從參數stream所指的文件中讀取一個字符。若讀到文件尾而無數據時便返回EOF-1)。雖然getc()fgetc()作用相同getc()爲宏定義,非真正的函數調用。

返回值  getc()會返回讀取到的字符,若返回EOF則表示到了文件尾。

範例  參考fgetc()

l          getchar(由標準輸入設備內讀進一字符) 

相關函數  fopenfreadfscanfgetc

表頭文件  #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(將一指定字符寫入文件流中)

相關函數  fopenfwritefscanfputc

表頭文件  #include <stdio.h>

定義函數  int fputc(int c, FILE * stream);

函數說明  fputc 會將參數轉爲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(將一指定字符寫入文件中)

相關函數  fopenfwritefscanffputc

表頭文件  #include<stdio.h>

定義函數  int putc(int c,FILE * stream);

函數說明  putc()會將參數c轉爲unsigned char寫入參數stream指定的文件中。雖然putc()fputc()作用相同,但putc()爲宏定義,非真正的函數調用。

返回值  putc()會返回寫入成功的字符,即參數c。若返回EOF則代表寫入失敗。

範例  參考fputc()。

l          putchar(將指定的字符寫到標準輸出設備) 

相關函數  fopenfwritefscanffputc

表頭文件  #include<stdio.h>

定義函數  int putchar (int c);

函數說明  putchar()用來將參數c字符寫到標準輸出設備

返回值  putchar()會返回輸出成功的字符,即參數c。若返回EOF則代表輸出失敗。

附加說明  putchar()非真正函數,而是putc(cstdout)宏定義。

範例  參考getchar()

 

 

 

2、    行讀寫文件流

l         puts(將字符串寫入標準輸出流stdout

相關函數  fopenfreadfscanffgets

表頭文件  #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(將一指定的字符串寫入文件內)

相關函數  fopenfwritefscanffputcputc

表頭文件  #include<stdio.h>

定義函數  int fputs(const char * s, FILE * stream);

函數說明  fputs()用來將參數s所指的字符串寫入到參數stream所指的文件內(但不追加換行符,也不寫入終止空字符)。

返回值  若成功則返回寫出的字符個數,返回EOF則表示有錯誤發生。

範例  請參考fgets()。

l         gets(從標準輸入設備讀進一字符串) 

相關函數  fopenfreadfscanffgets

表頭文件  #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(由文件中讀取一字符串——行讀寫文件流) 

相關函數  openfreadfscanfgetc

表頭文件  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(從文件流讀取數據) 

相關函數  fopenfwritefseekfscanf

表頭文件  #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(將數據寫至文件流) 

相關函數  fopenfreadfseekfscanf

表頭文件  #include<stdio.h>

定義函數  size_t fwrite(const void * ptr, size_t sizesize_t nmemb, FILE * stream);

函數說明  fwrite()用來將數據寫入stream所指定的文件流中。參數stream爲已打開的文件指針,參數ptr 指向欲被寫入的數據地址,總共寫入的字符數以參數size*nmemb來決定。fwrite()會返回實際寫入的nmemb數目

返回值  返回實際寫入的nmemb數目。

範例 參考fread()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章