Linux高级编程 8.12 标准IO

目录

一、标准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;
}

8.区别

fgetc/fputc         一个字符,一个字符地读,效率较低,文本文件和二进制文件都可以处理
fgets/fputs         一行一行地读,只能处理文本文件
fread/fwrite        自定义大小,文本文件和二进制文件(如照片)都可以处理

五、命令解读

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- 是其他人的权限,一般为只读;

上述rw-rw-r--权限为110110100,也就是664

修改文件权限使用chomd 

        方法:chomd 666 1.txt

        一般创建文件时,设置权限为666;创建目录时,设置权限为777。

        但是查看权限时发现会比设置时少2,也就是设置666,但是查看时会变成664

        这是因为系统中有umask,值为0002,新建文件和新建目录设置权限之后,会与此相减,形成一个比较合理的权限。

1代表着硬链接:两个文件名关联一个文件内容 ,硬链接只能链接文件,不能链接目录

第一个linux是用户名,第二个是组名

72是文件大小,如果加上-lh,可以修改单位

后面的时间是最后一次修改的时间

1.txt是文件名

.是当前目录

..是上级目录(一般都有这两个)

2.vimdiff小工具

可以比较两个文件不一样的地方,其不一样的地方会通过高亮标记出来。
使用方法:
vimdiff 加文件名

3.stat命令

可以用来查看文件的详细信息。
使用方法:stat 加文件名 其可以显示文件详细的大小,时间,等等信息

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值