IO是数据从硬盘到内存,内存到硬盘的流动。
I:input输入(数据从外部存储设备输入到内存中)。
O:output输出(数据从内存输出到外部存储设备)。
IO可分为文件IO和标准IO,文件IO是由操作系统提供的基本IO函数,与操作系统绑定,又称之为系统调用,而标准IO就是对文件IO的二次调用。
标准IO函数:
函数名 | 功能 | 函数 | 功能 |
fopen | 打开一个文件 | fclose | 关闭文件,释放缓冲区空间 |
perror | 根据errno打印对应的错误信息 | fprintf | 将数据格式化输出到指定文件中 |
fscanf | 从文件中格式化获取数据 | fputc | 将单个字符输出到文件中 |
fgetc | 从文件中获取单个字符 | fputs、 fgets | 将字符串输出到指定的文件中、 从文件中读取字符串,包括空格 |
fgetc和fputc函数的使用
1、拷贝文件
#include <stdio.h>
int main(int argc, const char *argv[])
{
//判断外部传参数量是否合理
if(argc < 3)
{
printf("请输入文件名\n");
return -1;
}
//打开文件,以读的方式
FILE* fp_r = fopen(argv[1], "r");
if(NULL == fp_r)
{
perror("fopen");
return -1;
}
//打开另外一个文件,以写的方式
FILE* fp_w = fopen(argv[2], "w");
if(NULL == fp_w)
{
perror("fopen");
return -1;
}
char c = 0; //存储字节
while(1)
{
c = fgetc(fp_r); //从fp_r中读取一个字节
if(EOF == c) //如果是EOF跳出循环,如果不是,则写入打破fp_w中
{
break;
}
fputc(c, fp_w); //fprintf(fp_w, "%c", c);
}
//关闭文件
fclose(fp_r);
fclose(fp_w);
return 0;
}
2、用fgetc计算一个文件的大小,并封装成函数
功能函数:(利用fgetc函数依次遍历文件的每个字节并统计个数)
long file_count(FILE *stream)
{
long count=0;
char c=fgetc(stream);
while(c != EOF)
{
count++;
c=fgetc(stream);
}
return count;
}
主函数:
#include<stdio.h>
int main(int argc, const char *argv[])
{
//以读方式打开文件
FILE* fp = fopen(argv[1],"r");
if(NULL==fp)
{
perror("fopen");
return -1;
}
//调用计算函数
long num=file_count(fp);
printf("该文件的大小为%ld\n",num);
//关闭文件
if(fclose(fp)<0)
{
perror("fclose");
return -1;
}
return 0;
}
3、用fgetc计算一个文件有几行,并封装成函数
linux操作系统以\n结尾,就算是最后一行也有一个'\n' ,所以我们只需统计'\n'的个数即可
功能函数块:
int file_count_line(FILE *stream)
{
int count=0;
char c=fgetc(stream);
while(c != EOF)
{
if(c=='\n')
{
count++;
}
c=fgetc(stream);
}
return count;
}
主函数:
int main(int argc, const char *argv[])
{
//以读方式打开文件
FILE* fp = fopen(argv[1],"r");
if(NULL==fp)
{
perror("fopen");
return -1;
}
int num=file_count_line(fp);
printf("该文件有%d行\n",num);
//关闭文件
if(fclose(fp)<0)
{
perror("fclose");
return -1;
}
return 0;
}
fputs和fgets函数的使用
1、拷贝文件
int main(int argc, const char *argv[])
{
//以读方式打开文件
FILE* fp = fopen(argv[1],"r");
if(NULL==fp)
{
perror("fopen");
return -1;
}
//以写方式打开文件
FILE* fp2 = fopen(argv[2],"w");
if(NULL==fp2)
{
perror("fopen");
return -1;
}
char str[20] =""; //存放取出字符
while(fgets(str,sizeof(str),fp) != NULL)
{
fputs(str,fp2);
}
//关闭文件
if(fclose(fp)<0)
{
perror("fclose");
return -1;
}
if(fclose(fp2)<0)
{
perror("fclose");
return -1;
}
return 0;
}
2、统计文件大小
功能函数
//统计文件大小函数,让fgets每次只取一个字符并让统计数加1
int file_count(FILE *fp)
{
int count=0;
char str[2];
while(fgets(str,sizeof(str),fp)!=NULL)
{
count++;
}
return count;
}
主函数
int main(int argc, const char *argv[])
{
//以读方式打开文件
FILE* fp = fopen(argv[1],"r");
if(NULL==fp)
{
perror("fopen");
return -1;
}
//调用函数
int num=file_count(fp);
printf("该文件大小为%d\n",num);
//关闭文件
if(fclose(fp)<0)
{
perror("fclose");
return -1;
}
return 0;
}
3、统计行数
功能函数
int file_count_line(FILE *fp)
{
int line=0; //存放行数
char str[2];
while(fgets(str,sizeof(str),fp)!=NULL)
{
if(str[0]=='\n')
{
line++;
}
}
return line;
}
主函数
int main(int argc, const char *argv[])
{
//以读方式打开文件
FILE* fp = fopen(argv[1],"r");
if(NULL==fp)
{
perror("fopen");
return -1;
}
int line=file_count_line(fp);
printf("该文件有%d行\n",line);
//关闭文件
if(fclose(fp)<0)
{
perror("fclose");
return -1;
}
return 0;
}