一、什么是文件?

1.概念:文件是一组相关数据的有序集合。

2.文件类型:

 

  • 常规文件 r
  • 目录文件 d
  • 字符设备文件 c
  • 块设备文件 b
  • 管道文件 p
  • 套接字文件 s
  • 符号链接文件 l

 

3.按照数据的组织格式又分为文本文件和二进制文件。

 

二、流

1.就C程序而言,所有的IO操作只是简单地从程序移进或者移出字节,这种字节流便被称为流(stream)。我简单的把流当做 数据从源文件到目标文件的过程机制。

2.在C语言中流分为两种类型:文本流(text stream)和二进制流(binary stream)

文本流:流中的每一个字符对应一个字节,用于存放对应的ASCII码值,因此文本流中的数据可以显示和打印出来,都是用户可以读懂的信息。

二进制流:二进制流中的字节将完全根据程序编写它们的形式写入到文件或者设备中,而且完全根据它们从文件或者设备读取的形式读入到程序中

 

3.流的缓冲类型分为全缓冲、行缓冲、无缓冲三种,其中当IO和一个终端关联时,典型的行缓冲。

4.标准IO预定义了三个流,程序运行自动打开

嵌入式C进阶笔记 ---标准IO_嵌入式

 

5.流和文件的区别

要说文件是数据的有序集合,存放数据的地方。那么我认为,流便是把数据从源中抽离出来,文件的管理机制。流操作函数操作的不是文件描述符,而是流缓冲区。

 

三、标准IO

标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。

标准IO提供API函数对文件进行一系列的操作。

标准IO通过缓冲机制减少系统调用,来实现更高的效率。

 

FILE结构体

 

  • FILE结构体是用来存放文件名、文件状态、位置等信息的。
  • 标准I/O的所有操作都是围绕FILE来进行

 

标准IO对对文件进行操作

嵌入式C进阶笔记 ---标准IO_嵌入式_02

 

复制一个文件

#include <stdio.h>

int main(int argc,  char *argv[])
{
   FILE *fps, *fpd;
   int ch;
   
   if (argc < 3) {
      printf("Usage : %s <src_file> <dst_file>\n", argv[0]);
	  return -1;
   }
 
   if ((fps = fopen(argv[1], "r")) == NULL) {
       perror("fopen");
	   return -1;
   }
   
   if ((fpd = fopen(argv[2], "w")) == NULL) {
       perror("fopen");
	   return -1;
   }
   
   while ((ch = fgetc(fps)) != EOF) {
      fputc(ch, fpd);
   }
   fclose(fps);
   fclose(fpd);

   return  0;
 }

 

四、相关函数

 

 

FILE *fopen (const char *path, const char *mode);     打开一个标准IO流,成功返回流指针,错误返回NULL
int fclose(FILE *stream);							关闭流,成功返回0,错误返回EOF
fgetc()/fputc()                                        一次读/写一个字符
fgets()和fputs()                                        一次读/写一行
fread()/fwrite()                                         每次读/写若干个对象,而每个对象具有相同的长度