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.

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

/*** 
                    *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流读入。。。

C语言中fgets(...)从流中读入输入,相反fputs(...)向文件写入数据。

对于ANSI C 程序,运行时系统会打开至少三个流,这3个流包括:

1.   标准输入    standard input .    标准定义为stdin.

2    标准输出    standard output.   标准定义为stdout

3.   标准错误    standard  error.     标准定义为stderr.

同时用FILE 结构指向这三个流。。

fputs(...)用于向这三个流写入数据。

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

s 为字符指针, 这儿既可以用字符数组,还可以字符指针,也可以直接使用字符串常量做为参数。

example:

FILE *fp=fopen("test.txt","w");

char s1[20]="hello world";

char *s2="hello C";

   fputs(s1,fp);   // 数组名

fputs(s2,fp);   //字符指针

fputs("hello",fp);  //字符串常量

上面三种用法都是可以的,实质上, C语言中字符串的直接值其实都是指针。

返回值:

如果写入成功,则返回非0,此时编译器默认为返回1.

如果写入错误,则返回EOF。

注意: fputs(char *s, FILE *stream) 函数向文件写入数据成功后,文件位置指针会自动向后移。

fputs(...)向屏幕输出数据。

既然FILE 结构可以指向三种流,当然也可以指向stdout 流

所以:

fputs("hello world",stdout);

就是想屏幕输出hello word.

最后来看看fputs(...)函数的标准库实现:

int  fputs(char *s, FILE *stream)

{

int c;

while(c =*s++)   //从这儿可以看出,fputs不会向流写入字符串结尾的空字符。

putc(c,stream);

return ferror(stream)? EOF: 非负值

}

时间: 2024-10-13 21:08:34

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

C语言文件操作之fgets()

    来说一说fgets(..)函数.     原型  char *  fgets(char * s, int n,FILE *stream);     參数:          s: 字符型指针,指向存储读入数据的缓冲区的地址.          n: 从流中读入n-1个字符          stream : 指向读取的流.    返回值:           1. 当n<=0 时返回NULL,即空指针.           2. 当n=1 时,返回空串"".      

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