fgets
#include<stdio.h>
char *fgets(char *str,int size,FILE *stream);
- char *str 指向存储读取到的字符串首地址指针。
- int size 读取最大的字符数(包括最后的空字符)。通常是使用以str传递数组的长度。
- FILE *stream 读取来源文件流指针。
- 返回值:成功时返回str,失败或者文件结尾时返回NULL。
fgets函数与fread函数一样可以检测到EOF。
fputs
#include <stdio.h>
int fputs(const char *str, FILE *stream);
- char *str指向需要写入的字符串首地址指针。
- 写入目标文件流指针。
- 返回值:成功时返回非负数,失败时返回EOF。
写入时不包含空字符。
这一点不同于fwrite函数,fwrite函数即使写到了缓冲区的实际结尾也会一直写下去,在缓冲区字符串没有填满的情况下会写入很多空字符造成文件写入错误。
示例
#include <stdio.h>
#include <string.h>
int main(){
FILE *fpr,*fpw;
fpr=fopen("read.txt","r");
fpw=fopen("write,txt","w");
char buf[BUFSIZ];
memset(buf,0,sizeof(buf));
if( fgets (buf,sizeof(buf),fpr)!=NULL ) {
fputs(buf,fpw);
}
fclose(fpr);
fclose(fpw);
return(0);
}
read.txt文件中的字符数远没有达到BUFSIZE,但write.txt文件输出是正常的,说明fputs没有越界写入。
#include <stdio.h>
#include <string.h>
int main(){
FILE *fpr,*fpw;
fpr=fopen("read.txt","r");
fpw=fopen("write,txt","w");
char buf[BUFSIZ];
memset(buf,0,sizeof(buf));
fread(buf,sizeof(buf),1,fpr);
fwrite(buf,sizeof(buf),1,fpw);
fclose(fpr);
fclose(fpw);
return(0);
}
同样的情况,fwrite函数不借助fread函数返回值时会写入很多的空字符,造成文件写入错误。