总结一下文件输入和输出常用函数用法
总结: fopen,getc,fgetc,putc,fputc,exit,fclose,fprintf,fscanf,fgets,fputs,puts,rewind,fseek,ftell,fflush,fgetpos,fsetpos,feof,ferror,ungetc,setvbuf,fread,fwrite函数用法。
偷偷给图片换个皮,要是被某人抓到了,那就是抓到我了
fopen用法: FILE *fp;fp=fopen(“1.txt”,“r+”);
这里说一下w和w+的区别: w只能写不能读,w+可读可写,用w就不能读取写入文件内容,w+就可以,a+同理,r+同理
getc()和fgetc用法: 在C语言中,用函数getc(fgetc)从文件读取字符。getc、fgetc用法相同。
getc的调用形式: ch=getc(fp);
此处的fp是文件指针, 函数功能是从文件指针指向的文件读入一个字符,并把它作为函数值返回给字符型变量ch。 #include <stdio.h> int main(){ char c;c = getc(stdin);//fgetc和getc一样,但是getc是优化最好的函数,它是由宏定义的 printf("%c",c); return 0; } 函数从输入流当前位置返回下一个字符,并将文件位置指示器增大。该字符作为一个无符号字符读取,并被转换成为一个整型值。如果到了文件的结尾或遇到读错误,将返回EOF。由于EOF是一个有效的整型值,当你操作二进制文件时,必须用feof函数进行文件结束检测。同样也必须使用ferror函数进行出错检查。
(fputc)putc函数用法:
int putc(int ch, FILE * fp);
把ch数值对应的ASCII码输出到fp里,fp可以是stdout或文件putc返回ch的值fputc和putc完全相同
exit用法: exit() ; 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束。 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。
在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值。
exit(0)表示进程正常退出. 返回 0.exit(1)和exit(-1)表示程序异常退出,exit(2)表示表示系统找不到指定的文件。
fclose用法:
FILE *fp=fopen(“1.txt”,“r+”); fclose(fp)//此时以关闭文件1.txt关闭打开的文件
fprintf和fscanf用法:
int i=5; fprintf(stdout,“666%d”,i);
此时屏幕打印6665,如果stdout换成文件指针(比如指向文档的fp文件指针)这句话就被写到文件里了
char ch;
fscanf(stdin,"%c",&ch)//此时和scanf用法相同,如果把stdin换成文件指针,就是从文件读取字符(千万不要用%s,会导致内存溢出)
fgets用法:
char ch[60]; fgets(ch,60,stdin); 从键盘获取60-1个字符,如果遇到换行符把换行符储存在数组里然后结束输出,stdin换成文件指针可以从文件读取。
fputs用法:
fputs(ch,stdout);
打印字符串ch到屏幕,如果stdout换成文件指针则输出到文件里,fputs不会在字符串后面加换行符,puts会在后面加换行符,puts和fputs用法一样。
rewind和fseek,ftell用法:
此时1.txt文档内有这样一组数据:123456789
FILE *fp=fopen(“1.txt”,“r+”); fseek(fp,1L,SEEK_SET); //执行完这条代码fp就指向数字2了
fseek(fp,2l,SEEK_CUR); //此时fp指向4
fseek(fp,0l,SEEK_END); //此时fp指向’\0’
long le; le=ftell(fp); //执行完这条代码le的值为10
rewind(fp); //此时缓冲区指针指向1,上面说fp意思也是缓冲区指针。
其中fseek函数的第一个参数是打开文件的指针,第三个参数表示指向文件何处, 如果是SEEK_SET指针指向文件内容开头, 如果是SEEK_CUR则指向当前指向文件内容的位置,保持不变, 如果是SEEK_END则指向文件末尾。
第二个参数是long型的,为偏移量, 如果是0l文件指针指向文件内容保持原位, 如果-3l文件指针则向前移动三位, 如果是3l文件指针则向后移动3位(如果到文件末尾了,继续向后移动也是可以的,至少我的编译器Dev-C++是可以的,但是fp此时就指向-1了,表示EOF)
fflush用法: //接上代码片段
fflush(fp); //把所有在缓冲区要写入的数据发送到fp指定的文件(刷新缓冲区),如果fp是空指针,所有输出缓冲区都被刷新(可能包含自建的,我也不知道咋看缓冲区状态,做题时候试试),输入流还没被定义(不用就行了,只要上一次操作不是输入,就可以用)
fsetpos和fgetpos用法(这里有个新类型,fpos_t类型): FILE *fp; fpos_t position; fp = fopen(“file.txt”,“w+”); fgetpos(fp, &position); //获取fp指向位置,返回给position,执行完position=0,成功执行后函数返回0,失败返回非0值
fputs(“Hello, World!”, fp); fsetpos(fp, &position); //执行完这条语句fp又指向文件开头了,如果成功执行返回0,失败返回非0的值。 这里position是可以被定义的, 比如position=2, 如果一个文档内容为123456, fsetpos(fp,&position); 此时fp指向数字3(开始指向的是数字1)
feof和ferror用法:
FILE *fp=NULL; char c; fp=fopen(“myfile.txt”,“r”); while(!feof(fp)) { c = fgetc(fp); printf("%c:\t%x\n",c,c); if(!ferror(fp)){ printf(“读取出错”); } } //feof识别文件指针是否指向结尾,如果指向结尾返回非0,如果未指向返回0,因为getc和fgetc不一定返回EOF就是读取到末尾了,所以用这个函数区分是否到结尾 //ferror同理,如果读取错误,返回非0,成功读取文件返回0。
ungetc用法: char n,i; scanf("%c",&i); ungetc(i,stdin); scanf("%c",&n); putchar(i); putchar(n); //当输入一个w时,会直接显示两个w,第一个w是第一个scanf读取了从键盘上输入的w储存给了i,然后ungetc把w再放进缓冲区,等于你又输入了一个w。
大概就像这样: 有三个杯子分别是1 2 3 ,2和3个杯子是空的, 1号杯子有红酒,把1号的酒倒进了2号, 然后调用ungetc函数之后, 2号把自己的酒复制了一份,复制为2+, 把酒2+倒回到一号杯子里,这样1号和2号就都有酒了, 但是1号的工作是把自己杯子里的就分配给2号和3号,如果没有调用ungetc函数, 2号满了,3号空着, 1号就要从酒厂继续倒酒,然后再倒给3号, 现在调用完ungetc函数,1号又有酒了, 1号就把酒倒给了3号,1号就不用去酒厂进酒了。
这就是ungetc函数用法
setvbuf用法:
FILE *fp; char ch[512]; fp=fopen(“1.txt”,w); if(setvbuf(fp,ch,_IOFBF,512)!=0){ puts(“创建缓冲区失败”); exit(-1); } //此时ch为fp文件的缓冲区,ch这个数组内容也是可以访问的,读取或写入都可以用,当你把缓冲区内某个字符改变,那么输出或写入内容也会改变。
如果是这样: setvbuf(fp,null,_IOFBF,512); 就自动创建一个缓冲区了, setvbuf作用就是创建缓冲区,
_IOFBF为全缓冲,就是填满缓冲区才写入文件, _IOLBF为行缓冲,写入一个换行符或者填满缓冲区才写入文件, _IONBF表示无缓冲,写入什么就立即写到文件内
函数成功执行返回0,执行失败返回非0值
fread和fwrite用法: int a[1], b[10]; int i, size = sizeof(int); FILE *fp; if( (fp=fopen(“demo.txt”, “rb+”)) == NULL ){ puts(“Fail to open file!”); exit(0); } //从键盘输入数据 并保存到数组a
for(i=0; i<10; i++){ scanf("%d", &a[i]); }
//将数组a的内容写入到文件
fwrite(a, size, 10, fp);
//将文件中的位置指针重新定位到文件开头 rewind(fp);
//从文件读取内容并保存到数组b fread(b, size, 10, fp);
介绍: fread(buffer, size, count, fp);
其中:buffer是存放数据的存储空间的起始地址;size是数据块的大小(字节数); count是读多少个块; fp是文件类型指针。 fread函数的功能是:从fp所指向的文件中读取数据块, 读取的字节数为size*count, 读取来的数据存放在buffer为起始地址的内存中。 若fread函数的返回值等于count, 则执行本函数读取数据成功; 若文件结束或发生错误,返回值等于0。
fwrite(buffer, size, count, fp);
其中四个参数的含义与fread函数基本相同,只不过现在是将内存中从buffer地址开始的数据往fp所指向的文件里写。
fwrite函数的的功能是:将内存中从buffer地址开始的数据往fp所指向的文件里写,写入到文件里的字节数为size*count。
如果觉得文档有用就转发点赞?关注呗
|