文件IO编程十
(1) fgets 详解
函数:char *fgets(char *s, int size, FILE *stream);
说明:fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符,读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。 若成功则返回s指针,返回NULL则失败。
(2) fputs详解
函数:int fputs(const char *s, FILE *stream);
说明:fputs()用来将参数s所指的字符串写入到参数stream所指的文件中,成功则返回写出的字符个数,失败则返回EOF。
都是行缓冲,都是对文本文件操作。
程序:每次都读99个字节,会自动加上\0
char buf[10];
while(1)
{
bzero(buf, 100);
if(fgets(buf, 100, fp_src) == NULL)
{
if(feof(fp_src))
break;
if(ferror(fp_src))
{
perror("fgets() failed");
break;
}
}
fputs(buf, fp_dst);
}
上面介绍的是行缓冲,下面介绍的是块缓冲。而且下面的称为直接IO函数,二进制IO函数。
(3) fread/fwrite 详解
函数:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
说明:参数stream为已经打开的文件指针,参数ptr为欲存放读取进来的数据空间,读取的字符以参数size*nmemb来决定。fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb来的小。则代表可能读到了文件尾或者失败,这时必须用feof()或者ferror()来判断。
函数:size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
说明:会返回实际写入的nmemb数目
假如有99个字符,size是20,nmemb是5,那么将返回4。此时比nmemb小1,就要进行判断
、
(3) ftell
函数:long ftell(FILE *stream);
说明:ftell()用来取得文件流目前的读写位置,参数stream为已打开的文件指针。当调用成功则会返回目前的读写位置。若有错误则返回1,errno会存放错误代码。
程序:
char buf[20*5];
int nread;
long begin, end;
while(1)
{
bzero(buf, 20*5);
begin = ftell(fp_src);
int nread = fread(buf, 20, 5, fp_src);
if(nread < 5)
{
if(feof(fp_src))
{
end = ftell(fp_src);
fwrite(buf, end-begin, 1, fp_src);
break;
}
if(ferror(fp_src))
{
perror("fread() failed");
exit(1);
}
fwrite(buf, 20, 5, fp_src);
}
}