字符读写函数 :fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:fread和fwrite
格式化读写函数:fscanf和fprinf
fopen fclose--将流式文件打开,关闭的函数fseek--改变文件位置指针的位置,文件位置指向改变则读写数据时候位置改变ftell--查看当前文件位置指针位置 feof--查看是否走到文件末尾 feof(fp),用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的值是1(真),否则为0(假)。rewind--文件位置指针指向文件首
注意:1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 读 w(write): 写 a(append): 追加 t(text): 文本文件,可省略不写 b(banary): 二进制文件 +: 读和写
2. “r”:凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。
3.“w”: 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
4. “a ”:若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。
5. fopen:在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。1、/*fgetc文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。*/#include <conio.h>#include <stdlib.h>#include<stdio.h>
int main(){ FILE *fp = NULL; char ch = 0; if( NULL == (fp = fopen("1.txt","r") ) ) { printf("/nCannot open file strike any key exit!"); getch();/*从控制台读取一个字符,但不显示在屏幕上,用getch(); 会等待你按下任意键,再继续执行下面的语句;需包含#include <conio.h>*/ exit(1);//异常结束 } ch = fgetc(fp); while(!feof(fp)) { putchar(ch); ch = fgetc(fp);}
fclose(fp); return 0; }
1注:在VC里,只有当文件位置指针(fp->_ptr)到了文件末尾,然后再发生读/写操作时,标志位(fp->_flag)才会被置为含有_IOEOF。然后再调用feof(),才会得到文件结束的信息。
因此,如果运行如下程序:char ch;while(!feof(fp)){ch = fgetc(fp);putchar(ch);}会发现多输出了一个FF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。
本文来自博客,转载请标明出处:http://blog.csdn.net/bingqing07/archive/2010/08/03/5785080.aspx
2、//fputc 写字符到文件#include <stdlib.h>#include<stdio.h>int main(){ FILE *fp = NULL; char ch = 0; if(NULL == (fp = fopen("2.txt","w+"))) { printf("Cannot open file press any key to exit!"); getch(); exit(1); }
/*以下做数据采集*/ printf("input characters,press enter key to exit:/n"); ch = getchar(); while (ch!='/n') { fputc(ch,fp); ch=getchar(); } rewind(fp);//调整文件位置指针
/*以下做输出显示*/ ch = fgetc(fp); while(0 == feof(fp)) { putchar(ch); ch=fgetc(fp); } printf("/n"); fclose(fp); return 0; }
3、//fgets 读字符串从文件#include <stdlib.h>#include<stdio.h>
int main()
{ FILE *fp; char str[10]; if(NULL == (fp=fopen("1.txt","r"))) { printf("/nCannot open file strike any key exit!"); getch(); exit(1); } fgets(str,10,fp); printf("%s/n",str); fclose(fp); return 0; }
4、//fputs 写字符串到文件#include <stdlib.h>#include<stdio.h>
int main()
{ FILE *fp; char ch,st[20]; if(NULL == (fp=fopen("1.txt","a+"))) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("input a string:/n"); scanf("%s",st); fputs(st,fp); rewind(fp);//rewind函数把文件内部位置指针移到文件首 ch=fgetc(fp); while(0 == feof(fp)) { putchar(ch); ch=fgetc(fp); } printf("/n"); fclose(fp); return 0; }
5、/*fwrite fread常用的数据块读写fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);其中:
buffer 是一个指针,在fread函数中,它表示从文件中读出若干数据,存放到的缓冲区的首地址。在fwrite函数中,它表示存放往文件中写入的数据的首地址。
size 表示每块数据块的字节数。
count 表示要读写的数据块块数。
fp 表示文件指针。*/
struct student
{ char name[10]; int num; int age; char addr[15]; }boy1[2],boy2[2],*pb1,*pb2;
int main()
{ FILE *fp = NULL; unsigned int i = 0; pb1 = boy1; pb2 = boy2; if(NULL == (fp=fopen("3.txt","w+"))) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("please input data/n"); for(i=0;i<2;++i,++pb1) scanf("%s%d%d%s",pb1->name,&pb1->num,&pb1->age,pb1->addr);//采集数据 pb1 = boy1;//调整回首地址 fwrite(pb1,sizeof(struct stu),2,fp);//写到文件 rewind(fp);//文件位置指针调整 fread(pb2,sizeof(struct stu),2,fp);//从文件中读取 printf("/n name /t number /t age /t addr/n"); for(i=0; i<2; ++i,++pb2) printf("%s/t]}s/n",pb2->name,pb2->num,pb2->age,pb2->addr); fclose(fp); return 0 ;
}
6、//fscanf和fprintf格式化读写函数fprintf格式化写到文件 fsanf 格式化从文件读与上例比较,fscanf和fprintf函数每次只能读写一个结构数组元素#include <stdlib.h>#include<stdio.h>
struct student
{ char name[10]; int num; int age; char addr[15]; }boy1[2],boy2[2],*pb1,*pb2;
int main()
{ FILE *fp = NULL; int i = 0; pb1 = boy1; pb2 = boy2; if(NULL == (fp=fopen("4.txt","wb+"))) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("please input data/n"); for(i=0;i<2;++i,++pb1) scanf("%s%d%d%s",pb1->name,&pb1->num,&pb1->age,pb1->addr);
pb1 = boy1; for(i=0;i<2;i++,pb1++) fprintf(fp,"%s %d %d %s/n",pb1->name,pb1->num,pb1->age,pb1-> addr); //格式化写入
rewind(fp);
for(i=0;i<2;++i,++pb2) fscanf(fp,"%s %d %d %s/n",pb2->name,&pb2->num,&pb2->age,pb2->addr); printf("/n name /t number age addr/n"); pb2 = boy2; for(i=0;i<2;i++,pb2++) printf("%s/t] }s/n",pb2->name,pb2->num, pb2->age, pb2->addr); fclose(fp); }
7、//文件的随机读写fseek重定位流(数据流/文件)上的文件内部位置指针 SEEK_SET: 文件开头 SEEK_CUR: 当前位置 SEEK_END: 文件结尾 成功,返回0,否则返回其他值。
int main( void ){ FILE *fstream = NULL; char line[80]; int result = 0; fstream = fopen( "fseek.txt", "w+" ); if( fstream == NULL ) printf( "The file fseek.txt was not opened/n" ); else { fprintf( fstream, "The fseek begins here: " //共23L个字符 "This is the file 'fseek.txt'./n" ); result = fseek( fstream, 23, SEEK_SET);//从文件开始位置开始右移23个字符位置 if( result ) printf( "Fseek failed" ); else { printf( "File pointer is set to middle of first line./n" ); fgets( line, 80, fstream ); printf( "%s", line ); } fclose( fstream ); } return 0;}
8、//ftell#include <stdio.h>
int main( void ){ FILE *fstream = NULL; long position = 0; char list[100] = {0,}; if( (fstream = fopen( "1.txt", "rb" )) != NULL ) { /* Move the pointer by reading data: */ fread( list, sizeof( char ), 100, fstream ); /* Get position after read: */ position = ftell( fstream ); printf( "Position after trying to read 100 bytes: %ld/n", position ); fclose( fstream ); }}
9、二进制和文本文件的区别仅仅是对'/n'的存储不同
int main( void ){ FILE *fstream = NULL; if( (fstream = fopen( "1.txt", "w" )) != NULL ) { fputs( "hello world!/n", fstream ); fclose( fstream ); } return 0;}