目录
1. 标准IO
2. 基本操作
2.1 fopen
2.2 fgetc
2.3 fputc
2.4 fgtes
2.5 fputs
2.6 fread
2.7 fwrite
3. linux的文件
1. 标准IO
(1)标准io的概念 1975 Dennis r IO库,C语言的标准,
IO --- input output
I: 键盘是标准输入设备 = > 默认输入就是指键盘 /dev/input
O: 显示器是标准输出设备 => 默认输出就是指显示器
Linux操作系统当中IO都是对文件的操作
任何支持标准C的系统都可使用标准IO实现文件存储
标准IO在UNIX上是对文件IO的封装
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。
(2)文件的概念:linux中一切都是文件。
作用:文件用来存储数据(数据,指令);
(3)<> 和 " " 的路径
< > :是系统库函数,默认路径在 /usr/include/
" " : 是用户自定义函数,默认当前路径。
(4)man 的使用
man man => 所有man的帮助
man xxx => man 1 xxx => 查看当前xxx命令
man 2 xxx => 查看xxx对应的系统调用函数
man 3 xxx => 查看xxx对应的标准库函数
注意:如果没有命令则直接man xxx 会显示其函数,如果没有系统调用则显示系统库函数帮助
(5)文件内容的分类
文本文件和二进制文件。
(6)流(FILE *)
数据从文件当中流入和流出所体现出来的字节流叫做流。
流可分为:二进制流、二进制数据的流、文本流。
2. 基本操作
step1 : 打开文件FILE ---- fopen
step2 : io 操作,读写操作
fgetc / fputc ---- 一个字符
fgets / fputs ---- 一次一行
fread / fwrite ---- 自定义大小,操作二进制文件
step3 : 关闭文件 ---- fclose
2.1 fopen
功能:打开一个文件,并建立一个流
语法:FILE *fopen(const char *path, const char *mode);
path:要打开文件的路径
mode:
r --- 只读(文件不存在报错,文件存在则只读打开)
r+ --- 读写(文件不存在报错,文件存在则读写打开)
w --- 只写(文件不存在则创建,文件存在则清0只写打开)
w+ --- 写读(文件不存在则创建,文件存在则清0写读打开)
a --- 追加可写(文件不存在则创建,文件存在则追加只写打开 定位到文件最后增加内容。
a+ --- 追加读写(文件不存在则创建,文件存在则追加读写打开
返回值:成功返回建立的文件流指针,失败返回NULL
2.2 fgetc
功能:从流中读取一个字符
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE * fp = fopen("1.txt","r"); // 打开 1.txt 文件,r 代表只读
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
while(1)
{
int c = fgetc(fp); // 将读到的字符存到 c
if(EOF == c) // 判断结束
{
break;
}
printf("%c\n",c);
}
fclose(fp); // 关闭文件
return 0;
}
2.3 fputc
int fputc(int c, FILE *stream);
功能:向流中写入一个字符
c --- 要写入的字符
stream ---- 文件流指针
返回值:成功返回写入的字符ASCII码值,失败返回EOF
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE * fp = fopen("1.txt","w");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
int ret = fputc('h',fp);
if(-1 == ret)
{
printf("fputc error\n");
return 1;
}
fputc('e',fp);
fputc('l',fp);
fputc('l',fp);
fputc('o',fp);
fclose(fp);
return 0;
}
fgetc 与 fputc 的复制:
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc < 3) // 需要输入至少3个命令--- ./a.out 1 2
{
printf("usage:./a.out srcfile dstfile\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;
}
while(1)
{
int c = fgetc(src);
if(EOF== c)
{
break;
}
fputc(c,dst);
}
fclose(dst);
fclose(src);
return 0;
}
2.4 fgtes
功能:从流中读取一个字符串
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE * fp = fopen("/etc/passwd","r");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
char buf[1024]={0};// 1k-4k
while(1)
{
char* s = fgets(buf,sizeof(buf),fp);
if(NULL == s)
{
break;
}
printf("%s\n",buf);
}
fclose(fp);
return 0;
}
2.5 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 data[]="hello,world";
int ret = fputs(data,fp);
if(EOF == ret)
{
printf("fputs error\n");
return 1;
}
fclose(fp);
return 0;
}
fgets 与 fputs 的复制:
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc<3)
{
printf("usage:./a.out srcfile dstfile\n");
return 1;
}
FILE * src_fp = fopen(argv[1],"r");
FILE * dst_fp = fopen(argv[2],"w");
if(NULL == src_fp ||NULL == dst_fp)
{
printf("fopen error\n");
return 1;
}
char buf[1024]={0};
while(1)
{
char* s = fgets(buf,sizeof(buf),src_fp);
if(NULL == s)
{
break;
}
fputs(buf,dst_fp);
}
fclose(dst_fp);
fclose(src_fp);
return 0;
}
2.6 fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在的本地内存中。
参数:ptr 要存储数据的本地内存一般是数组或者结构体指针
size 单个数据块的元数据大小。最小单元的大小
nmemb 要获取的数据块的个数,拷贝的数据块个数。
stream 要获取数据的源文件流对象,如果是stdin表示从键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:成功 小于等于nemeb的整数,表示获取的数据长度,失败 小于0,结尾 0;
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[50];
int age;
char phone[15];
}PER;
int main(int argc, char *argv[])
{
FILE * fp = fopen("1.txt","r");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
PER per;
// memset(&per,0,sizeof(per));
bzero(&per,sizeof(per));
size_t ret= fread(&per,sizeof(per),1,fp);
printf("name:%s age:%d phone:%s\n",per.name,per.age,per.phone);
if(ret!=1)
{
printf("fread error\n");
return 1;
}
fclose(fp);
return 0;
}
2.7 fwrite
size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);
功能:从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应的文件流对象中。
参数:ptr 要写的数据块地址,一般是数组或者结构体指针
size 要写的数据块元数据大小,单位是字节
nmemb 要写的数据块的个数
stream 要写的目标文件流对象。如果是stdout则表示数据会写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。
返回值:成功 小于等于nmemb 的个数,失败 <0
#include <stdio.h>
#include <string.h>
typedef struct
{
char name[50];
int age;
char phone[15];
}PER;
int main(int argc, char *argv[])
{
FILE * fp = fopen("1.txt","w");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
PER per;
strcpy(per.name ,"zhangsan");
per.age = 20;
strcpy(per.phone,"111222333");
size_t ret = fwrite(&per,sizeof(per),1,fp);
if(ret!=1)
{
printf("fwrite error\n");
return 1;
}
fclose(fp);
return 0;
}
3. linux的文件
(1)文件类型:有七种文件类型
d --- 目录文件
c --- 字符设备
b --- 块设备
l --- 软链接
p --- 管道文件
s --- 套接字
- --- 普通文件
(2)权限
r --- 只读
w --- 写
x --- 执行
用户 组用户 其他人
chmod 改权限-
chmod 214 1.txt --- 将1.txt文件的权限改为 -w- --x r--
(010 001 100)
注:复制其他文件夹,目标文件夹未写明路径,目标文件默认与a.out在同一路径