-->

标准IO

标准文件IO函数

  • (标准C库提供)函数的使用

    注意:标准C库提供的函数都是调用了内核的函数实现的如(open、write、read、close),经过这些函数封装出来的。

  1. fopen()

函数的作用:用于打开文件(filename),对文件各种操作。

//函数原型
FILE *fopen(const char * restrict filename,const char * restrict mode);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
filename 文件的路径和文件的名字
mode 文件的权限(字符串“r”)

mode的选项太多,下面列出选项的作用

选项 描述
r 只读文本的方式打开文件,光标在头部
w 只写文本的方式打开文件,光标在头部。如果文件内有其他的数据,会清除,重新在头部输出。
a 可读可写文本的方式打开文件,如果有数据,光标会在后面追加,如没有这个文件会创建
r+ 可读可写文本的方式打开文件
w+ 可读可写文本的方式打开文件,文件不存在会创建,文件存在并且内部有数据会清空。
a+ 可读可写文本的方式打开文件,文件不存在会创建,文件存在并且内部有数据会在尾部追加。
b 以上的所有选项都可以加上这个选项如ab+,使用这个选项以二进制的方式打开文件。不加这个选项是以文本的方式打开这个文件,系统会自动对文件进行解释和说明。
  • 函数的返回值
(FILE *) 

这个类型是一个结构体

struct _IO_FILE
{
  int _flags;		/* High-order word is _IO_MAGIC; rest is flags. */

  /* The following pointers correspond to the C++ streambuf protocol. */
  char *_IO_read_ptr;	/* Current read pointer */
  char *_IO_read_end;	/* End of get area. */
  char *_IO_read_base;	/* Start of putback+get area. */
  char *_IO_write_base;	/* Start of put area. */
  char *_IO_write_ptr;	/* Current put pointer. */
  char *_IO_write_end;	/* End of put area. */
  char *_IO_buf_base;	/* Start of reserve area. */
  char *_IO_buf_end;	/* End of reserve area. */

  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
  int _flags2;
  __off_t _old_offset; /* This used to be _offset but it's too small.  */

  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

这个结构体是一个链表类型,每一个结点都存储着被打开文件的数据。接收这个返回值可以对指导这个文件的信息(系统是从堆内存分配的空间)。

每当文件运行时,系统会首先打开stdio stdout stderr这三个文件。

  1. fclose

函数的作用:用于打开文件(filename),对文件各种操作。

//函数原型
int fclose(FILE *stream);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
stream 打开文件的信息
  • 函数的返回值
int 

成功关闭返回0,关闭失败返回EOF

//EOF是一个宏定义 值是-1
# define EOF (-1)
  1. fgetc()

函数的作用:从文件中(stream)中获取一个字符,注意读取的是时候光标会跟着推进。

//函数原型
int fgetc(FILE *stream);

//这个函数和fgetc几乎相同
int getc(FILE *stream);

//这个函数和上面两个几乎相同,只不过默认从标准输入(stdin)中获取字符
int getchar(void);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
stream 打开文件的信息
  • 函数的返回值
int 

返回读取字符的``ASIIC,如果光标到了末尾或者读取出错返回EOF`

//EOF是一个宏定义 值是-1
# define EOF (-1)
  1. fgets()

函数的作用:从文件中(stream)中获取n个字符,放在s中,注意读取的是时候光标会跟着推进。

//函数原型
char *fgets(char * restrict s, int n,FILE * restrict stream);

//这个函数用法差不多相同,只不过默认从标准输入(stdin)中获取字符串,直到结束或者遇到\n
char *gets(char *s);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
s 把文件读取到这个缓冲区
n 读取n个字符
stream 打开文件的信息
  • 函数的返回值
char *

读取成功返回s的地址 ,读取出错返回NULL

  1. fread()

函数的作用:从文件中(stream)中获取nmemb块字符串,每一块字符串的大小是size,放在ptr中,注意读取的是时候光标会跟着推进。

//函数原型
size_t fread(void * restrict ptr,size_t size, size_t nmemb,FILE * restrict stream);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
ptr 把文件读取到这个缓冲区
size 每一块字符串的大小
nmemb 读取nmemb块字符串
stream 打开文件的信息
  • 函数的返回值
size_t

读取成功返回读取块的个数nmenbsize 和 nmenb为0时,返回值为0,返回小于nmenb时可能是读取出错,或者到了文件末尾。

  1. fputc()

函数的作用:写入文件中(stream)一个字符,注意读取的是时候光标会跟着推进。

//函数原型
int fputc(int c, FILE *stream);

//这个函数和fputc几乎相同
int putc(int c, FILE *stream);

//这个函数和上面两个几乎相同,只不过默认从标准输出(stdout)中输出字符c
int putchar(int c);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
stream 打开文件的信息
  • 函数的返回值
int 

返回读取字符的``ASIIC,如果读取出错返回EOF`

//EOF是一个宏定义 值是-1
# define EOF (-1)
  1. fputs()

函数的作用:写入文件中(stream)一个字符串s,注意读取的是时候光标会跟着推进。

//函数原型
int fputs(const char * restrict s,FILE * restrict stream);

//这个函数用法差不多相同,只不过默认从标准输出(stdout)中输出字符串,自动会帮你加上\n
int puts(const char *s);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
s 把s中的字符串写入到文件中
stream 打开文件的信息
  • 函数的返回值
int 

写入成功返回非负值,写入错误返回EOF

  1. fread()

函数的作用:写入文件中(stream)nmemb块字符串,每一块字符串的大小是size,字符串都在ptr,写入的时候光标会跟着推进。

//函数原型
size_t fread(void * restrict ptr,size_t size, size_t nmemb,FILE * restrict stream);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
ptr 把这个缓冲区的字符串写入到文件中
size 每一块字符串的大小
nmemb 读取nmemb块字符串
stream 打开文件的信息
  • 函数的返回值
size_t

写入成功返回写入块的个数nmenbsize 和 nmenb为0时,返回值为0,返回小于nmenb时可能是写入出错,或者到了文件末尾。

  1. fseek()

函数的作用:可以确定文件中光标的位置。

//函数原型
int fseek(FILE *stream, long int offset, int whence);

//需要的头文件
#include <stdio.h>
  • 函数参数
参数 描述
offset 光标的偏移量(负数向左偏移)(正数向右偏移)
whence 光标的位置(SEEK_SET起始位置)(SEEK_END文件的末尾)(SEEK_CUR
stream 打开文件的信息
  • 函数的返回值
int

返回非0数

posted @ 2024-06-01 13:52  wuju  阅读(21)  评论(0)    收藏  举报