Linux C语言标准输入输出(2)

  fclose 函数关闭指定的文件流 stream,使所有尚未写出的数据都写出。因为 stdio 库会对数据进行缓冲,所以使用 fclose 是很重要的。如果程序需要确保数据已全部写出,则应该调用 fclose 函数。

#include <stdio.h>

int fclose(FILE *stream);

五、fflush 函数

  fflush 函数的作用是把文件流里所有未写出的数据立刻写出。

#include <stdio.h>

int fflush(FILE *stream);

  在 调用 fclose 函数时,隐含执行了一次 flush 操作,因此不需要再调用 fclose 之前调用 fflush。

六、fseek 函数

  fseek 函数是与 lseek 系统调用对应的文件流函数。它在文件流里为下一次读写操作指定位置。当调用 fseek 成功时,返回 0,调用失败时 返回 -1 并设置 errno 指出错误。

#include <stdio.h>

int fseek(FILE *stream,long int offset,int whence);

七、fgetc、getc 和 getchar 函数

  fgetc 函数从文件流里取出下一个字节,并把它作为一个字符返回(返回的是该字符的 ASCII 码)。当它到达文件尾或出现错误时,返回 EOF(在 stdio.h 中有定义: #define EOF -1)。必须通过 ferror 或 feof 来区分这两种情况。函数原型如下:

#include <stdio.h>

int fgetc(FILE *stream);    // 注意,返回值是一个字符,但是这里用 int 类型来存放字符而不是用 char 类型
int getc(FILE *stream);
int getchar();

  getc 函数的作用和 fgetc 函数一样,但是,getc 函数可以被实现为宏,因此:

1)getc 函数的参数不应该是具有副作用(如影响变量)的表达式,因为它可能会被计算多次;

2)fgetc 一定是一个函数,因此它的地址可以作为一个参数传递给另一个函数;而 gets 函数则不能保证其地址一定能作为一个函数指针传递给另一个函数;

3)由于 getc 函数可以被实现为宏,因此调用 getc 函数所用的时间可能会比 fgetc 要短。

  getchar 函数的作用就相当于 getc(stdin),它直接从标准输入里读取下一个字符。

注意:为什么返回值是四个字节的 int 类型?

  这是为了考虑文件结束标志 EOF 的取值。EOF 取值是 -1,如果用 unsigned 类型的话,显然取不到 -1;而如果用 char 类型的话,则 -1 对应的值为 0xff(C 语言中,数值以补码形式存储),但是 0xff 又可以是一个字节的 ASCII 码值(一些扩展字符的 ASCII > 127溢出时,可能会产生值为 0xff 的ASCII 码),这样用 EOF 显然就不能判断文件是否结束了,因为会把 ASCII 码值为 0xff 的字节误判为文件结束符。如果将返回值用 int 类型来存放的话,那么 EOF(也就是 -1)将会被保存为 0xffffffff,这时在读到 0xff,用 int 类型进行存储的话,就是 0x000000ff,就不会和 EOF 相冲突了。

八、fputc、putc 和 putchar 函数

  fputc 函数把一个字符写到一个输出文件流中。它返回写入的值,如果失败,则返回 EOF。

#include <stdio.h>

int fputc(int c,FILE *stream);    // 需要注意的是,这里的 c 其实是字符,把字符当做 int 类型而不是 char 类型
int putc(int c,FILE *stream);
int putchar(int c);

  putc 函数的作用与 fputc 函数一样,但是它能被实现为一个宏。putchar 函数相当于 putc(c,stdout),它把单个字符写到标准输出。 

  注意:putchar 和 getchar 都是把字符当做 int 类型而不是 char 类型来使用的,理由上面有讲。用一个例子演示一下 fgetc 和 fputc 函数的用法:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
        int buf;
        FILE *file = fopen("linuxidc.txt","r");
        if(file == NULL){
                printf("fail to open the file!\n");
                exit(1);
        }

while((buf = fgetc(file)) != EOF){
                fputc(buf,stdout);
        }
        fclose(file);

exit(0);
}

Linux C语言标准输入输出

输出:

hello,my name is Linux公社
2018.10.28

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0907621db02809e6e26a0240fa8c246d.html