C语言文件操作函数及部分经验总结_第1页
C语言文件操作函数及部分经验总结_第2页
C语言文件操作函数及部分经验总结_第3页
C语言文件操作函数及部分经验总结_第4页
C语言文件操作函数及部分经验总结_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

fopen()打开流FILE*fopen(constchar*filename,constchar*mode)字符串含义"r"以只读方式打开文件"w"以只写方式打开文件"a"以追加方式打开文件"r+"以读/写方式打开文件,如无文件出错"w+"以读/写方式打开文件,如无文件生成新文件fclose()关闭流 intfclose(FILE*fp)如果成功,返回0,失败返回EOF。fputc()写一个字符到流中 intfputc(intc,FILE*stream)成功返回这个字符,失败返回EOF。fgetc()从流中读一个字符 intfputc(FILE*stream)成功返回这个字符,失败返回EOF。fseek()在流中定位到指定的字符 intfseek(FILE*stream,longoffset,intwhence)如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是符号常量值基准位置SEEK_SET0文件开头SEEK_CUR1当前读写的位置SEEK_END2文件尾部fputs()写字符串到流 intfputs(constchar*s,FILE*stream)fgets()从流中读一行或指定个字符 char*fgets(char*s,intn,FILE*stream)从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。fprintf()按格式输出到流 intfprintf(FILE*stream,constchar*format[,argument,...])fscanf()从流中按格式读取 intfscanf(FILE*stream,constchar*format[,address,...])feof()到达文件尾时返回真值 intfeof(FILE*stream)ferror()发生错误时返回其值 intferror(FILE*stream)voidclearerr(FILE*stream) 返回流最近的错误代码,可用clearerr()来清除它rewind()复位文件定位器到文件开始处 voidrewind(FILE*stream)remove()删除文件 intremove(constchar*filename)成功返回0。fread()从流中读指定个数的字符 size_tfread(void*ptr,size_tsize,size_tn,FILE*stream)fwrite()向流中写指定个数的字符 size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream)tmpfile()生成一个临时文件流FILE*tmpfile(void)以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。tmpnam()生成一个唯一的文件名 char*tmpnam(char*s)参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。longftell(FILE*p);ftell函数可以返回一个long型数值,该值是从文件开头到当前读写位置的全部的字节个数,当ftell返回的值等于文件的长度时,表示读写位置位于文件的末尾。

>>

关于文件结束符EOF

EOF是EndOfFile的缩写。

在C语言中,它是在标准库中定义的一个宏。

人们经常误认为EOF是从文件中读取的一个字符。其实,EOF不是一个字符,它被定义为是

int

类型的一个

说的标准.正解.>>关于文件结束符EOF

EOF是EndOfFile的缩写。

在C语言中,它是在标准库中定义的一个宏。

人们经常误认为

EOF是从文件中读取的一个字符(牢记)。其实,EOF不是一个字符,它被定义为是int类型的一个负数(比如-1)。EOF也不是文件中实际存在的内容。EOF也不是只表示读文件到了结尾这一状态(这种状态可以用feof()来检测),它还能表示I/O操作中的读、写错误(通常可以用ferror()来检测)以及其它一些关联操作的错误状态。getchar返回EOF如果读到文件末大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的TheCProgrammingLanguage(SecondEdition)

第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多琐碎的知识点长时间过后就会淡忘的,只有写下来才是最好的方法。

其实,getchar()最典型的程序也就几行代码而已。

对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c=getchar())!=EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。

这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:char

c;

c

=getchar();

这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&RC中特别提到了这个问题):int

c;

c

=getchar();

二、EOF的两点总结(主要指普通终端中的EOF)

1.EOF作为文件结束符时的情况:

EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。

(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;

(2)在前面输入的字符为换行符时,接着输入Ctrl+D;

(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的Ctrl+D的作用将在下面介绍。

其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。

2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。

这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:

abcabc

注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。

如果输入abc之后,然后回车,输入换行符的话,则终端显示为:

abc

//第一行,带回车

abc

//第二行

//第三行

其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。

从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。

EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。

【补充】本文第二部分中关于EOF的总结部分,适用于终端驱动处于一次一行的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符

进行的。但是终端驱动处于一次一行的模式,它的输入只有到“\n”或者EOF时才结束,因此,终端上得到的输出也都是按行的。

(1)字节的读取

在正常的情况下,getc以unsignedchar的方式读取文件流,扩张为一个整数,并返

回.换言之,getc从文件流中取一个字节,并加上24个零,成为一个小于256的整数,

然后返回.

intc;

while((c=fgetc(rfp))!=-1)//-1就是EOF

fputc(c,wfp);

上面fputc中的c虽然是整数,但在fputc将其写入文件流之前,又把整数的高24位

去掉了,因此fgetc,putc配合能够实现文件复制.到目前为止,把c定义为

char仍然是可行的,但下面我们将看到,把c定义为int是为正确判段文件是否结束.

(2)判断文件结束.

多数人认为文件中有一个EOF,用于表示文件的结尾.但这个观点实际上是错误的,在文

件所包含的数据中,并没有什么文件结束符.对getc而言,如果不能从文件中读取,

则返回一个整数-1,这就是所谓的EOF.返回EOF无非是出现了两种情况,一是文件已

经读完;二是文件读取出错,反正是读不下去了.

请注意:在正常读取的情况下,返回的整数均小于256,即0x0~0xFF.而读不出返回的

是0xFFFFFFFF.但,假如你用fputc把0xFFFFFFFF往文件里头写,高24位被屏蔽,写入的将

是0xFF.//lixforalpha请注意这一点

(3)0xFF会使我们混淆吗?

不会,前提是,接收返回值的c要按原型定义为int.

如果下一个读取的字符将为0xFF,则

intc;

c=fgetc(rfp);//c=0x000000FF;

if(c!=-1)//当然不等,-1是0xFFFFFFFF

fputc(wfp);//噢,OXFF复制成功.

字符0xFF,其本身并不是EOF.

(4)将c定义char

假定下一个读取的字符为0xFF则

charc;

c=fgetc(rfp);//fgetc(rfp)的值为0x000000FF,暗中降为字节,c=0xFF

if(c!=-1)//字符与整数比较?c被带符号(signed)扩展为0xFFFFFFFF,喔噢,

条件成立,文件复制提前退出.

while((c=fgetc(rfp))!=EOF)中的判别条件成立,文件复制结束!意外中止.

(5)将c定义为unsignedchar;

当读到文件末尾,返回EOF也就是-1时,

unsignedcharc;

c=fgetc(rfp);//fgetc(rfp)的值为EOF,即-1,即0xFFFFFFFF,降格为字节,c=0xFF

if(c!=-1)

//c被扩展为0x000000FF,永远不回等于0xFFFFFFFF

所以这次虽然能正确复制0xFF,但却不能判断文件结束.事实上,在c为uchar时,

c!=-1是永远成立的,一个高质量的编译器,比如gcc会在编译时指出这一点.

(6)为何需要feof?

FILE*fp;

fp指向一个很复杂的数据结构,feof是通过这个结构中的标志来判断文件是否结束的.

如果文件用fgetc读取,刚好把最后一个字符读出时,fp中的EOF标志不会打开,这时

用feof判断,将会得到文件尚未结束的结论.

fgetc返回-1时,我们仍无法确信文件已经结束,因为可能是读取错误!这时我们

需要feof和ferror.//EOF与feof()的确切含义2009-10-2317:42今天,遇到了在读文件的时候,居然总是读到文件中间某个字符时,就退出了,我判断是文件中的某个字符和文件的结束符相同导致的。

经过检查,确实发现有些在文本文件里不可见的字符导致了这个结果。处理方法是,用二进制打开就没有这个问题了。

在这里也比较深的看了一些关于eof和feof()网上的一些介绍:(只作参考:)一下是引用:eof指endoffile,是超过了文件末尾,文件读写都有个当

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论