C语言文件操作之fgets()

    来说一说fgets(..)函数。

    原型  char *  fgets(char * s, int n,FILE *stream);

    參数:

         s: 字符型指针,指向存储读入数据的缓冲区的地址。

         n: 从流中读入n-1个字符

         stream : 指向读取的流。

   返回值:

          1. 当n<=0 时返回NULL,即空指针。

          2. 当n=1 时,返回空串"".

          3. 假设读入成功,则返回缓冲区的地址。

          4. 假设读入错误或遇到文件结尾(EOF),则返回NULL.

          看看这个函数的官方说明:

                       /***

*char *fgets(string, count, stream) - input string from a stream

*

*Purpose:

* get a string, up to count-1 chars or ‘\n‘, whichever comes first,

* append ‘\0‘ and put the whole thing into string. the ‘\n‘ IS included

* in the string. if count<=1 no input is requested. if EOF is found

* immediately, return NULL. if EOF found after chars read, let EOF

* finish the string as ‘\n‘ would.

*

*Entry:

* char *string - pointer to place to store string

* int count - max characters to place at string (include \0)

* FILE *stream - stream to read from

*

*Exit:

* returns string with text read from file in it.

* if count <= 0 return NULL

* if count == 1 put null string in string

* returns NULL if error or end-of-file found immediately

*

*Exceptions:

*

*******************************************************************************/ 

            标准库中fgets(...)的实现:

             /****************************************************

              char *fgets(char *s, int n,  FILE *stream)

               {

                    register int c;

                    register char *cs;

                    cs=s;

                    while(--n>0 &&(c = getc(stream))!=EOF)

                         if ((*cs++=  c) ==‘\n‘)

                           break;

                     *cs =‘\0‘;

                     return (c == EOF && cs == s) ?NULL :s ;

                   }

            /********************************************************

             在用fgets(..)读入数据时,先定义一个字符数组或字符指针,假设定义了字符指针 ,那么一定要初始化。

        example:

              char s[100]; //能够。

              char *s;  //不能够,由于仅仅是声明了一个指针。但并没有为它分配内存缓冲区。

              所以,假设要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];      假设为分配内存空间,编译时不会检查出问题,但执行时会出现未知错误。。

        fgets(...)读入文本行时的两种情况。

          1。    假设n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。而且在s的最后插入字符串结束标志‘\0‘。 而s缓冲区剩余的位置不会再填充。

           example:

              123abc

              fgets(s,10,fp);

              此时,读入七个字符,123abc\n,实际上还有最后的‘\0‘,所以,strlen(s)=7; 假设要去除末尾的\n,s[strlen(s)-1]=‘\0‘;便可。

          2.     假设n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n由于并没有到行尾 ,相同在最后会插入‘\0‘.

          example:

            123abc

            char  s[5];

            fgets(s,5,fp);

            这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.

       fgets(...)读入整个文件内容

          通经常使用while()循环来使fges()读入文本所有内容,并按行读入。

           char s[1024];

            while((fgets(s,1024,fp))!=NULL)

             {

                   printf(s);

             }

         当然假设n小于每行的字符个数,也能够读,仅仅只是读的次数要多。

          如果一行为 : 123456789

           char s[2];

           int  num=0;

           while((fgets(s,2,fp))!=NULL)

             {

                  printf(s);

                  n++;

             }

            每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,仅仅要是文本流没关闭。

         读入空行的情况:

            第一行   abcdef123

            第二行                       

            第三行  helloworld

            当中第二行为空,fget(..)会把第二行也读入,由于并未到文件结尾。

            有时我们并不须要空行,能够这样做。

            while((fgets(s,n,fp))!=NULL)

               {

                    if(strlen(s)!=1)    //注意这儿是1不是0,由于虽然是空行,它也会读入换行符,strlen(s)=1;

                        printf(s);

               }

       
 fgets(...)从标准设备读数据。

            用fgets(...)还也读入标准输入设备(一般为键盘)的信息

            原型  :  fgets(s,n,stdin);

            如果在控制台下,我们能够用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,由于不会像gets()有溢出的可能。。

            比方 :输入 abc

            fgets(s,n,stdin)也会读入n-1个字符。可是仅仅是从stdin流读入。。。

            

               

时间: 2024-10-08 02:57:43

C语言文件操作之fgets()的相关文章

C语言文件操作之fgets() /fputs()

来说一说fgets(..)函数. 原型  char *  fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储读入数据的缓冲区的地址. n: 从流中读入n-1个字符 stream : 指向读取的流. 返回值: 1. 当n<=0 时返回NULL,即空指针. 2. 当n=1 时,返回空串"". 3. 如果读入成功,则返回缓冲区的地址. 4. 如果读入错误或遇到文件结尾(EOF),则返回NULL. 看看这个函数的官方说明: /**

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

C 语言文件操作

1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不能随机存取:也意味着是一段连续的内容,每块数据之间的顺序是确定的.比如一个很大的文件,不能一次性加载到内存里面,无法直接获取文件任意位置的内容,只能逐渐加载到内存.     比如 TCP 被抽象为 stream 而 UDP 被抽象为 block.     2. 缓冲区:     fopen 时, 磁盘 --> 缓冲区

c语言文件操作函数

c语言文件操作函数大全 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. w 打开只写文件,若文件存在则文件长度清为0,即该文件

C语言文件操作(二)

实例2:读取字符文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fin; FILE *fout=fopen("c:\\dest.txt","wt"); char buf[MAXLEN]; if((fin=fopen("c:\\test.txt","rt"))!=NULL

C语言文件操作函数大全(超详细)

C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

C语言文件操作(一)

实例1:读写字符文件,每次读取一个字符. #include<stdio.h> #include <stdlib.h> int main() { FILE *fpin ; FILE *fpout; char c; fpout=fopen("c:\\dest.txt","wt"); if((fpin=fopen("c:\\test.txt","rt"))!=NULL) { c = fgetc(fpin);

C语言文件操作(三)

实例3:读写字节文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fpin ; FILE *fpout; unsigned char buf[MAXLEN]; int c; fpout=fopen("c:\\dest.jpg","wb"); if((fpin=fopen("c:\\test.jpg&q