1.标准IO的概念
IO:input output
- I:键盘是标准输入设备(默认输入就是指键盘)
- O:显示器是标准输出设备(默认输出就是指显示器)
ANSIC 设计的一组用文件IO封装的操作库函数头文件:stdio.h 标准输入输出头文件
/usr/include/stdio.h
< > :是系统库函数,默认路径在/usr/include/
eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库
" " : 是用户自定义函数,默认是当前路径
eg : ===>xxx.h ===>xxx.c
- man man ==>所有man的帮助
- man xxx == man 1 xxx ===>查看当前xxx命令
- man 2 xxx ===>查看xxx对应的系统调用函数
- man 3 xxx ===》查看xxx对应的标准库函数
注意: 如果没有命令则直接man xxx 会显示其函数
如果没有系统调用则显示系统库函数帮助
- Linux系统中IO都是对文件的操作。
- C语言中只有一部分,支持标准C的系统都可使用标准IO实现文件存储。
- 在UNIX中标准IO是对文件IO的封装。
一般都是对普通文件操作,是一种有缓存的IO在文件IO和用户程序之间加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。
2.文件
概念:Linux中一切都是文件。
作用:用来存储数据(数据、指令)。
文件的打开
- 打开文件(fopen),FILE
- 读写操作(fgetc/fputc 一个字符、fgets/fputs一次一行,只能处理文本文件、fread/fwrite 自定义大小,二进制)。
- 关闭文件 (fclose)
r | 只读文件,不存在报错,文件存在则只读打开 |
r+ | 读写文件不存在报错文件存在则读写打开 |
w | 只写文件不存在则创建文件存在则清0只写打开 |
w+ | 写读文件不存在则创建文件存在则清0写读打开 |
a | 追加可写文件不存在则创建文件存在则追加只写打开 |
a+ | 追加读写文件不存在则创建文件存在则追加读写打开 |
文件的读写
1.fputc和fgetc
(1)fputc读文件
(2)fgetc写文件
2.fputs和fgets
(1)fputs读文件
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE* fp = fopen("1.txt","w");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
char buf[500]="你好,fgets测试";
int ret = fputs(buf,fp);
if(EOF == ret)
{
printf("fputs errors\n");
return 1;
}
fclose(fp);
return 0;
}
(2)fgets
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE* fp = fopen("/etc/passwd","r");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
char buf[512]={0};
while(1)
{
memset(buf,0,sizeof(buf));
if(fgets(buf,sizeof(buf),fp))
{
printf("%s\n",buf);
}
else
{
break;
}
}
fclose(fp);
return 0;
}
(3)fgets_cp
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
if(argc<3)
{
printf("usage:./a.out filename1 filename2\n");
return 1;
}
FILE* src = fopen(argv[1],"r");
FILE* dst = fopen(argv[2],"w");
if(NULL == src ||NULL == dst)
{
printf("fopen error\n");
return 1;
}
char buf[1024]={0};
while(1)
{
memset(buf,0,sizeof(buf));
if(fgets(buf,sizeof(buf),src))
{
//printf("%s\n",buf);
fputs(buf,dst);
}
else
{
break;
}
}
fclose(dst);
fclose(src);
return 0;
}
3.fread和fwrite
(1)fwrite写文件
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[10];
int age;
char phone[15];
}PER;
int main(int argc, char *argv[])
{
FILE* fp = fopen("1.hex","w");//binary
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
PER per;//memset
bzero(&per,sizeof(per));//bit zero
strcpy(per.name, "zhangsan");
per.age = 20;
strcpy(per.phone,"123467");
fwrite(&per,sizeof(PER),1,fp);
fclose(fp);
return 0;
}
(2)fread读文件
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[10];
int age;
char phone[15];
}PER;
int main(int argc, char *argv[])
{
FILE* fp = fopen("1.hex","r");//binary
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
;
PER per;//memset
bzero(&per,sizeof(per));//bit zero
fread(&per,sizeof(per),1,fp);
printf("name:%s age:%d phone:%s\n",per.name,per.age,per.phone);
fclose(fp);
return 0;
}