目录
一、标准io
二、文件
三、man手册
四、操作文件
1.fopen
2.fputc
3.fgetc
4.fgets
5.fputs
6.fread
7.fwrite
五、命令解读
1.显示目录下的文件信息命令
2.vimdiff小工具
3.stat命令
一、标准io
IO: input output
I: 键盘是标准输入设备 (默认)
O: 显示器是标准输出设备 (默认)
stdio.h:标准输入输出头文件
/usr/include/stdio.h
<> 是系统库函数,默认路径在/usr/include/
eg : ====>stdio.h ===>stdio.c==>libc.so ==>/usr/lib
.so 动态库(或共享库)
usr:user resource
"" 是用户自定义函数,默认是当前路径
二、文件
struct FILE
{
}
流: FILE*
数据从文件当中流入和流出所体现出来的字节流叫做流
流的分类:
二进制流: 二进制数据的流
文本流:ASCII码数据的流
命令:od -t x1 文件路径
od指的是查看文件字节命令
-t指的是以二进制数查看
x后面数字指的是以一个一个字符打印
对于太大的文件,可以加上less,减少显示内容,也就是显示文件的一部分
文本流:od -c x1 文件路径
将文本中的数据转换成字符查看
-c指的是以文本的形式查看
同样可以加less
eg:od -c status |less
三、man手册
man man:所有man的帮助
man xxx == man 1 xxx ===>查看当前xxx命令
man 2 xxx ===>查看xxx对应的系统调用函数
man 3 xxx ===》查看xxx对应的标准库函数
man 后面只能跟函数和命令,但是名字必须写对,严格匹配
man -k 模糊查找
四、操作文件
(1),打开文件 FILE
(2),io操作,读写操作
(3),关闭文件
1.fopen
FILE *fopen(const char *pathname, const char *mode);
mode:
r 只读
文件不存在报错
文件存在则只读打开
r+ 读写
文件不存在报错
文件存在则读写打开
w 只写
文件不存在则创建
文件存在则清0只写打开
w+ 写读
文件不存在则创建
文件存在则清0写读打开
a 追加可写
文件不存在则创建
文件存在则追加只写打开 定位到文件最后增加内容。
a+ 追加读写
文件不存在则创建
文件存在则追加读写打开
返回值:
成功返回建立的文件流指针
失败返回NULL
2.fputc
int fputc(int c, FILE *stream);
功能:
向流中写入一个字符
参数:
c:要写入的字符
stream:文件流指针
返回值:
成功返回写入的字符ASCII码值
失败返回EOF(end of file==-1)
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE * fp=fopen("1.txt","w");
if(fp==NULL)
{
printf("fopen erro\n");
return 1;
}
int ret=fputc('h',fp);
if(ret==-1)
{
printf("fputs erro\n");
return 1;
}
fputc('e',fp);
fputc('l',fp);
fputc('l',fp);
fputc('o',fp);
fclose(fp);
return 0;
}
3.fgetc
int fgetc(FILE *stream);
功能:
从流中读取一个字符
参数:
stream:文件流指针
返回值:
成功返回读到字符的ASCII码值
读到文件末尾返回EOF
失败返回EOF -1
利用fgetc和fputc实现复制文件操作
#include <stdio.h>
int main(int argc, const char *argv[])
{
if(argc<3)
{
printf("usage:./a.out srcfile destfile\n");
return 1;
}
FILE *src=fopen(argv[1],"r");
FILE *dest=fopen(argv[2],"w");
if(NULL==src || NULL==dest)
{
printf("fopen erro\n");
return 1;
}
while(1)
{
int c=fgetc(src);
if(EOF==c)
{
break;
}
fputc(c,dest);
}
fclose(src);
fclose(dest);
return 0;
}
4.fgets
char *fgets(char *s, int size, FILE *stream);
功能:从stream流对象关联的文件中获取size大小字节的文本数据
并存储到s对应的本地内存(栈区数组,堆区内存)
参数: s 要存储数据的本地内存
size 要获取的数据长度,单位字节。
stream 要获取的目标文件流对象,
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
失败 或者 文件末尾 NULL;
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp=fopen("1.txt","r");
if(fp==NULL)
{
printf("fopen error\n");
return 1;
}
char buf[1024]={0};
while(1)
{
char *s=fgets(buf,sizeof(buf),fp);
if(NULL==s)
{
break;
}
printf("%s\n",buf);
}
return 0;
}
5.fputs
int fputs(const char *s, FILE *stream);
功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件流对象。
参数: s 要写的信息,一般是固定的字符串或者有数据的数组。
stream 要写入的目标文件流对象
返回值:成功 nonnegative number on success
失败 -1;
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp=fopen("mao.txt","w");
if(NULL==fp)
{
printf("fopen error\n");
return 1;
}
char a[]="just do it";
int ret=fputs(a,fp);
if(ret==EOF)
{
printf("fputs error\n");
return 1;
}
fclose(fp);
return 0;
}
利用fgets和fputs实现文件复制
#include <stdio.h>
int main(int argc, const char *argv[])
{
if(argc<3)
{
printf("usage: ./a.out srcfile destfile\n");
}
FILE *src=fopen(argv[1],"r");
FILE *dest=fopen(argv[2],"w");
if(src==NULL || dest==NULL)
{
printf("fopen error\n");
}
char buf[1024]={0};
while(1)
{
char *s=fgets(buf,sizeof(buf),src);
if(NULL==s)
{
break;
}
fputs(buf,dest);
}
fclose(src);
fclose(dest);
return 0;
}
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, const char *argv[])
{
FILE *fp=fopen("1.txt","r");
if(fp==NULL)
{
printf("fopen error\n");
}
PER 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;
}
局部变量初始化:
在定义局部变量之后如果不进行初始化,其内部空间的数据是混乱且随机的。
我们有三种方法处理:
(1).初始化:
buf[1024] ={0};
(2).memset函数
将空间按预定值填充
memset(void *p,int c,size_t size);
其中
void*p指的是所要清空空间的地址
int c指的是填充清空空间的目标数
size_t 指的是要清空多少个空间
(3).bzero(void* P,size_t size).
用零填充空间,以二进制形式清零
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>
struct person
{
char name[50];
int age;
char phone[15];
};
int main(int argc, const char *argv[])
{
FILE *fp=fopen("1.txt","w");
if(NULL==fp)
{
printf("fopen error\n");
}
struct person s={"zhangsan",20,"13425678576"};
size_t ret=fwrite(&s,sizeof(s),1,fp);
if(ret !=1)
{
printf("fwrite error\n");
return 1;
}
fclose(fp);
return 0;
}
五、命令解读
1.显示目录下的文件信息命令
-rw-rw-r-- 1 linux linux 72 8月 12 16:24 1.txt
将上述分开解读
- rw- rw- r--
前面第一个字符含义:
- 代表着普通文件
d 代表目录
c 代表字符设备
b 代表块设备
l 软连接(符号链接)
p 管道文件-----系统用内存虚拟出的文件
s 套接字文件
r w x
r代表读,如果不能则写成-;
w代表写,如果不能则写成-;
x代表可执行,如果不能则写成-;
第一个rw- 是用户的权限;
第二个rw- 是组成员的权限;
第三个r- 是其他人的权限,一般为只读;
1代表着硬链接:两个文件名关联一个文件内容
第一个linux是用户名,第二个是组名
72是文件大小,如果加上-lh,可以修改单位
后面的时间是以后一次修改的时间
1.txt是文件名
.是当前目录
..是上级目录(一般都有这两个)
2.vimdiff小工具
可以比较两个文件不一样的地方,其不一样的地方会通过高亮标记出来。
使用方法:
vimdiff 加文件名
3.stat命令
可以用来查看文件的详细信息。
使用方法:stat 加文件名 其可以显示文件详细的大小,时间,等等信息