设为首页 加入收藏

TOP

Linux C语言标准输入输出(一)
2018-10-28 16:08:27 】 浏览:388
Tags:Linux 语言 标准 输入 输出

  标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口。这个库现在已经成为 ANSI 标准 C 的一部分。标准 I/O 库提供了许多复杂的函数用于格式化输出和扫描输入。在很多方面,你使用的标准 I/O 库的方式和使用底层文件描述符一样,需要先打开一个文件以建立一个访问路径,这个操作的返回值将作为其他 I/O 库函数的参数。在标准 I/O 库中,与底层文件描述符对应的是(stream,需要注意的是这个流与 C++ 中的输入输出流不一样),它被实现为指向结构 FILE 的指针(文件指针)。


  在启动程序时,有 3 个文件流是自动打开的,它们是 stdin、stdout 和 stderr,在 stdio.h 中定义,分别代表着标准输入、标准输出和标准错误输出,与底层文件描述符 0、1、2 相对应。可用的文件流数量与文件描述符一样,都是有限制的,实际的限制由头文件 stdio.h 中定义的 FOPEN_MAX 来定义,它的值至少为 8,在 Linux 系统中,通常是 16。


一、fopen 函数


  用于文件和终端的输入输出,,类似于系统调用 open。调用 fopen 函数成功时,返回一个非空的 FILE * 指针,调用失败时,返回 NULL。函数原型如下:


#include <stdio.h>


FILE *fopen(const char *filename,const char *mode);


  关于 FILE 结构,有:


typedef struct _iobuf{
    int  cnt;      // 剩余字符数
    char  *ptr;    // 下一个字符的位置
    char  *base;    // 缓冲区的位置
    int  flag;    // 文件访问模式
    int  fd;      // 文件描述符
}FILE;


  fopen 打开由 filename 参数指定的文件,并把它与一个文件流关联起来。mode 参数指定文件打开的方式,可以取以下的一些值:


  其中,字母 b 表示文件是一个二进制文件而不是文本文件。另外,需要注意的是,mode 参数是一个字符串而不是一个字符,因此总是需要使用双引号 " " 括起来。


二、fread 函数


  fread 函数用于从一个文件流里读取数据。调用 fread 成功时,返回成功读到缓冲区里的记录个数(不是字节数)。函数原型如下:


#include <stdio.h>


size_t fread(void *ptr,size_t size,size_t nitems,FILE *stream);


   数据从文件流 stream 读到由 ptr 指向的数据缓冲区里,size 参数指定每个数据记录的长度,计数器 nitems 给出要传输的记录个数。举个例子:


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


int main()
{
        int buffer[10];
        int i;
        int counter;
        counter = fread(buffer,1,10,stdin);
        printf("读取到缓冲区的记录个数为:%d\n",counter);
        fwrite(buffer,sizeof(int),1,stdout);


        exit(0);
}


  这段代码从标准输入读取 10 个 字符到缓冲区中,然后调用 fwrite 函数将缓冲区中的前 4 个字符写到标准输出。


三、fwrite 函数


  fwrite 函数从指定的数据缓冲区里取出数据记录,并把它们写到输出流中,返回成功写入的记录个数,其参数与 fread 函数的参数类似。


#include <stdio.h>


siize_t fwrite(const void *ptr,size_t size,size_t nitems,FILE *stream);


  需要注意的是,用 fwrite 写的文件在不同的计算机体系结构之间可能不具备可移植性,因此,不推荐把 fread 和 fwrite 用于结构化数据。演示代码如下:


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


测试下


输出:


Linux C语言标准输入输出


  这段代码将 buffer 中的内容写入标准输出。


四、fclose 函数


  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),它直接从标准输入里读取下一个字符。


注意

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中重载、覆盖和隐藏的区别以及.. 下一篇C++中的函数及参数介绍

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目