1. 标准IO和文件IO的区别
1. 标准IO是一种有缓存的IO形式(接收了一部分内容后给到linux内核中)
2. 文件IO是一种没有缓存的IO形式(即刻交给linux内核,及时性)
3. 标准IO是库函数,库函数可以在Windows和Linux系统中都能运行
4. 文件IO是系统调用,系统调用是Linux内核中的函数接口,只能在Linux内核中使用
2. 流和流指针
1. 流
你声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。
int ch;
while((ch=getc(fp))!=EOF)
putchar(ch);
这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。
2. 流指针
它主要用于跟踪文件的当前位置以及指示下一个读取或写入操作将在文件中进行的位置。流指针的主要作用是跟踪文件的位置,这样在进行文件读写操作时就知道从哪里开始读取或者写入数据。在文件读取时,流指针会自动向前移动,以便指向下一个要读取的数据;而在文件写入时,流指针也会相应地移动,以便确保数据被写入到正确的位置。
3. 文件的分类
文件分为文本文件和二进制文件
4. fopen
4.1 定义
FILE *fopen(const char *pathname, const char *mode);
4.2 功能
打开一个文件,并与文件建立一个流
4.3 参数
1. pathname:指向文件路径字符串的首地址的指针
2. mode:指向一个字符串的指针
"r" 只读打开 文件存在只读打开,文件不存在报错
"r+" 读写打开 文件存在读写打开,文件不存在报错
"w" 只写打开 文件存在清0只写打开,文件不存在创建文件
"w+" 写读打开 文件存在清0写读打开,文件不存在创建文件
"a" 追加只写打开 文件存在追加只写打开,文件不存在创建文件
"a+" 追加读写打开 文件存在追加写读打开,文件不存在创建文件
3. 返回值
成功返回一个文件流指针
失败返回NULL
4.4 示例代码
FILE* fp = fopen("1.txt","w");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
5. fclose
5.1 定义
FILE *fopen(const char *pathname, const char *mode);
5.2 功能
关闭文件流指针对应的流
5.3 参数
stream:文件流指针
5.4 返回值
成功返回0
失败返回EOF(-1)
6. fputc
6.1 定义
int fputc(int c, FILE *stream);
6.2 功能
向流中写入c对应的字符
6.3 参数
c:写入流中的字符对应的ASCII码值
stream:文件流指针
6.4 返回值
成功返回写入字符对应的ASCII码值
失败返回EOF(-1)
6.5 注意
1.只能写字符
2.只能写一个字符
6.6 示例代码
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int ch = 0;
fp = fopen("1.c", "w");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
ch = fputc('A', fp);
printf("ch = %c\n", ch);
fclose(fp);
return 0;
}
7. fgetc
7.1 定义
int fgetc(FILE *stream)
7.2 功能
从流中读取一个字符
7.3 参数
stream:文件流指针
7.4 返回值
成功返回读取到的字符的ASCII码值
读到文件末尾返回EOF(用做读取文件的结束条件)
读取出错返回EOF
7.5 示例代码
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int ch = 0;
fp = fopen("1.c", "r");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
while (1)
{
ch = fgetc(fp);
if (ch == EOF)
{
break;
}
printf("ch = %c\n", ch);
}
fclose(fp);
return 0;
}
7.6 使用fputc和fgetc实现cp
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *src = NULL;
FILE *dst = NULL;
if(argc<3)
{
printf("输入有误,请重新输入!\n");
return 1;
}
src = fopen(argv[1], "r");
dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
printf("fopen failed!\n");
return -1;
}
while (1)
{
int ch = 0;
ch = fgetc(src);
if (EOF == ch)
{
break;
}
fputc(ch, dst);
}
fclose(src);
fclose(dst);
return 0;
}
8. fputs
8.1 定义
int fputs(const char *s, FILE *stream);
8.2 功能
向流中写入s指针指向的字符串
8.3 参数
s:要写入流中的字符串的首地址
stream:文件流指针
8.4 返回值
成功返回非负数
失败返回EOF
8.5 示例代码
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
fp = fopen("1.c", "w");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
fputs("SuperCarryDoinb", fp);
fclose(fp);
return 0;
}
9. fgets
9.1 定义
char *fgets(char *s, int size, FILE *stream);
9.2 功能
从流中尝试读取size个字符,存放到s指针指向的空间
9.3 参数
s:存放字符串空间首地址
size:尝试读取字符的个数
stream:文件流指针
9.4 返回值
成功返回s(存放字符串空间首地址)
失败返回NULL
读到文件末尾返回NULL
9.5 示例代码
1. 读单行
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char str[32] = {0};
char *ch = NULL;
fp = fopen("1.c", "r");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
ch = fgets(str, 16, fp);
printf("str = %s\n", ch);
fclose(fp);
return 0;
}
2. 读多行
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
fp = fopen("/etc/passwd", "r");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
while (1)
{
char str[512] = {0};
char *ch = NULL;
ch = fgets(str, sizeof(str), fp);
if (NULL == ch)
{
break;
}
printf("%s", ch);
}
fclose(fp);
return 0;
}
3.l利用fputs和fgets实现cp功能
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *src = NULL;
FILE *dst = NULL;
if(argc<3)
{
printf("输入有误,请重新输入!\n");
return 1;
}
src = fopen(argv[1], "r");
dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
printf("fopen failed!\n");
return -1;
}
while (1)
{
char str[512] = {0};
char *ch = NULL;
ch = fgets(str, sizeof(str), src);
if (NULL == ch)
{
break;
}
fputs(str, dst);
}
fclose(src);
fclose(dst);
return 0;
}
10. fwrite
10.1 定义
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
10.2 功能
向流中写入ptr指向的nmemb个对象,每个对象size个字节
10.3 参数
ptr:存放数据空间的首地址
size:每个对象的大小
nemeb:对象的个数
stream:文件流指针
10.4 返回值
成功返回写入对象的个数
失败返回0
10.5 示例代码
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char str[32] = "SuperSorryDoinb";
fp = fopen("1.c", "w");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
fwrite(str, sizeof(char), 15, fp);
fclose(fp);
return 0;
}
11. fread
11.1 定义
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
11.2 功能
从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间
11.3 参数
ptr:存放数据空间首地址
size:对象大小
nmemb:对象个数
stream:文件流指针
11.4 返回值
成功返回实际读取到对象的个数
失败返回0
读到文件末尾返回0
11.5 示例代码
1.
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char str[32] = {0};
fp = fopen("1.c", "r");
if (NULL == fp)
{
printf("fopen failed!\n");
return -1;
}
fread(str, sizeof(char), 15, fp);
printf("str = %s\n", str);
fclose(fp);
return 0;
}
2. 利用fwrite和read实现cp功能
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *src = NULL;
FILE *dst = NULL;
char str[32] = {0};
src = fopen(argv[1], "r");
dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
printf("fopen failed!\n");
return -1;
}
fread(str, sizeof(char), 15, src);
fwrite(str, sizeof(char), 15, dst);
fclose(src);
fclose(dst);
return 0;
}