3.1.14.1、标准IO和文件IO有什么区别
(1)看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API
(2)C语言库函数是由API封装而来的。库函数内部也是通过调用API来完成操作的,但是库函数因为多了一层封装,所以比API要更加好用一些。
(3)库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。所以C库函数具有可移植性而API不具有可移植性。
(4)性能上和易用性上看,C库函数一般要好一些。譬如IO,文件IO是不带缓存的,而标准IO是带缓存的,因此标准IO比文件IO性能要更高。
3.1.14.2、常用标准IO函数介绍
(1)常见的标准IO库函数有:fopen、fclose、fwrite、fread、ffulsh(刷新,先写到缓存区,就算缓冲区没有满,会直接写下去)、fseek
实例: fp = fopen(FILENME, "w+");
"w+" 如果文件不存在则创建,如果文件存在则清空文件内容 ,写文件
#include <stdio.h>
#include <stdlib.h>
#define FILENME "1.txt"
int main(void)
{
FILE *fp = NULL;
fp = fopen(FILENME, "w+"); //"w+" 如果文件不存在则创建,如果文件存在则清空文件内容
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen succes. fp = %p.\n", fp);// 打印文件指针
//接下来就可以读写文件
fclose(fp);
return 0;
}
现在开始文件 里写点东西
实例
#include <stdio.h>
#include <stdlib.h>
#define FILENME "1.txt"
int main(void)
{
FILE *fp = NULL; // 定义一个fopen的返回的指针类型
size_t len = -1; //定义一个fwrite的返回值
fp = fopen(FILENME, "w+"); //"w+" 如果文件不存在则创建,如果文件存在则清空文件内容
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen succes. fp = %p.\n", fp);// 打印文件指针
//接下来就可以读写文件
len = fwrite("abcde", 1, 5, fp);//这样我们就写了5个元素,每个元素是1个字节
printf("len = %d .\n",len);
fclose(fp);
return 0;
}
运行结果:
这样写不太规范!!
我们一般这样写
#include <stdio.h>
#include <stdlib.h>
#define FILENME "1.txt"
int main(void)
{
FILE *fp = NULL; // 定义一个fopen的返回的指针类型
size_t len = -1; //定义一个fwrite的返回值
int array[10] = {1,2,3,4,5};
fp = fopen(FILENME, "w+"); //"w+" 如果文件不存在则创建,如果文件存在则清空文件内容
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen succes. fp = %p.\n", fp);// 打印文件指针
//接下来就可以读写文件
//写文件
//len = fwrite("abcde", 1, 5, fp);//这样我们就写了5个元素,每个元素是1个字节
//sizeof(int) = 4; sizeof(array)数组总大小=40; sizeof(array[0]数组首元素的字节大小=4 ;
//sizeof(array)/sizeof(array[0] 相除得到元素个数 10
len = fwrite(array, sizeof(int), sizeof(array)/sizeof(array[0]), fp);
printf("len = %d .\n",len);
fclose(fp);
return 0;
}
运行结果
接下来再看看读 文件 fread ""
返回值 size_t 就是读了多少个元素
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENME "1.txt"
int main(void)
{
FILE *fp = NULL; // 定义一个fopen的返回的指针类型
size_t len = -1; //定义一个fwrite的返回值
char buf[100]={0};
fp = fopen(FILENME, "r+"); //"r+"
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen succes. fp = %p.\n", fp);// 打印文件指针!意义不大
//接下来就可以读写文件
//读文件
memset(buf, 0, sizeof(buf));// 先把 buf 清空
len = fread(buf, 1, 10, fp); //读文件 ,char 类型占 1 个字节, 读10个字节, 去fp文件里读
//len = fread(buf, sizeof(buf), sizeof(buf)/sizeof(buf[0]), fp);
printf("len=%d.\n",len);
printf("buf is [%s] .\n",buf);
fclose(fp);
return 0;
}
运行结果
总结:
总体框架就是:
#define FILENME "1.txt"
FILE *fp = NULL; // 先定义一个fopen的返回的指针类型
fp = fopen(FILENME, "r+"); //"r+" 读文件 or fp = fopen(FILENME, "w+"); //写文件
fp 就指向了 1.txt 的文件 ,就可以进行 读写操作
len = fwrite("abcde", 1, 5, fp);//这样我们就写了5个元素,每个元素是1个字节
len = fread(buf, 1, 10, fp); //读文件 ,char 类型占 1 个字节, 读10个字节, 去fp文件里读