C

C 知识量:16 - 74 - 317

13.5 其他标准I/O函数><

ungetc()函数- 13.5.1 -

ungetc()函数用于把参数指定的字符放回输入流。如果把一个字符放回输入流中,那么下次调用标准输入函数时将读取该字符。ANSI标准保证每次只会放回一个字符,但是,如果具体实现允许把一行中的多个字符放回输入流,那么下一次输入函数读取的字符顺序与放回时的顺序相反。

ungetc()函数的原型如下所示:

int ungetc(int c, FILE * fp);

fflush()函数- 13.5.2 -

fflush()函数用于将输出缓冲区中所有未写入数据发送到参数指定的输出文件中。这个过程就称为刷新缓冲区。

fflush()函数的原型如下所示:

int fflush(FILE * fp);

setvbuf()函数- 13.5.3 -

setvbuf()函数的原型如下所示:

int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);

该函数用于创建一个供标准I/O函数替换使用的缓冲区。但是,需要在打开文件后且未对流进行其他操作之前,调用该函数。其中:

  • 指针fp用于识别待处理的流。

  • buf用于指向待使用的存储区。

  • size用于说明数据大小。

  • mode的可选项为:_IOFBF(完全缓冲,缓冲区满时刷新)、_IOLBF(行缓冲,缓冲区满或写入换行符时刷新)、_IONBF(无缓冲)。

如果setvbuf()函数操作成功,函数返回0,否则返回一个非零值。

fread()和fwrite()函数- 13.5.4 -

fread()和fwrite()函数用于以二进制形式处理数据。

1、fwrite()函数。原型如下:

size_t fwrite(const void * restrict ptr, 
              size_t size, 
              size_t nmemb, 
              FILE * restrict fp);

该函数用于把二进制数据写入文件。其中:

  • size_t是sizeof运算符返回的类型,通常是unsigned int。

  • ptr是待写入数据块的地址。

  • size是待写入数据块的大小(以字节为单位)。

  • nmemb是待写入数据块的数量。

  • fp指定待写入的文件。

示例:

char buffer[256];
fwrite(buffer, 256, 1, fp);

以上代码把一块256字节的数据从buffer数组中写入文件。

fwrite()函数返回成功写入项的数量,即nmemb,但如果写入出错,返回值会比nmemb小。

2、fread()函数。原型如下:

size_t fread(void * restrict ptr, 
             size_t size, 
             size_t nmemb, 
             FILE * restrict fp);

该函数用于读取被fwrite()写入文件的数据。其中:

  • ptr是待读取文件数据在内存中的地址。

  • fp指定待读取的文件。

示例:

char buffer[256];
fread(buffer, sizeof (char), 256, fp);

以上代码将256个char类型大小的值拷贝进buffer数组中,其作用与fwrite()的示例正好相反。

fread()函数返回成功读取项的数量,即nmemb,但如果读取错误或读到了文件结尾,该返回值就会比nmemb小。

feof()和ferror()函数- 13.5.5 -

当标准输入函数返回EOF时,表明函数已到达文件结尾。但是,在程序读取错误时,也会返回EOF。为了区分具体情况,需要使用feof()函数和ferror()函数。

feof()函数原型为:

int feof(FILE * fp);

ferror()函数的原型为:

int ferror(FILE * fp);

当上一次输入检测到文件结尾时,feof()函数会返回一个非零值,否则返回0。当读写出现错误时,ferror()函数会返回一个非零值,否则返回0。