深入理解Linux文件系统编程(二)

Linux文件系统编程实战

一、创建文件

<span style="font-size:14px;">#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<fcntl.h>
//创建文件子函数
void creat_file(char *filename)
{
	int fd;		//系统调用描述文件的文件描述符(为非负数)
	if(fd=creat(filename,0775)<0)
	{
		perror("创建文件失败");
		exit(1);//非正常跳出
	}
	else
	{
		printf("创建 %s 文件成功\n",filename);
	}
}
/*可传入参数的主函数入口*/
int main(int argc,char **argv)
{
	int i;
	if(argc<2)	//说明没有传入文件名,创建文件失败
	{
		perror("您没有输入文件名,创建文件失败!");
		exit(1);
	}
	for(i=1;i<argc;i++)
	{
		creat_file(argv[i]);	//调用子函数依次创建给定文件名的文件
	}
	exit(0);
	return 0;
}

//编译:gcc test1 -c test1.c
//运行:./test1 hello1 hello2,创建两个文件hello1和hello2.</span>

二、写入一个字符到文件中

/*Filename:test2.c
 *功能:终端输入一些字符,直到用户输入一个"#"为止结束输入,最后依次将他们保存到磁盘一个文件中。
 *Date:2014.11.21
*/
#include<stdio.h>
#include<stdlib.h>
void main()
{
	FILE *stream;			//声明一个FILE类型指针变量,用于保存打开文件的相关信息
	char ch,filename[10];
	printf("请输入要创建文件名称:\n");
	scanf("%s",filename);	//输入即将创建文件名称,其中数组名为数组首地址(可包含绝对地址)

	/*1.(创建)以只写方式打开一个文件*/

	if(stream=fopen(filename,"w")==NULL)
	{
		printf("Can not open %s.",filename);
		exit(1);
	}
	ch=getchar();	//接收回车字符

	/*2.输入需要写入文件的字符*/

	printf("请输入要依次写入的字符,每个字符都需以回车键确认.\n");
	ch=getchar();  //从键盘接收第一个写入的字符
	while(ch!='#')  //依次写入一个字符到文件中
	{
		fputc(ch,stream);	//将一个字符写入到指针变量stream指定的文件中
		putchar(ch);		//打印一下字符到中断显示,以便判定
		ch=getchar();		//接收终端输入的下一个字符,直到用户输入'#'后结束输入
	}
	fclose(fp);		//关闭文件
	putchar(10);	//换行字符
}

//编译 gcc test2 -c test2.c
//运行 ./test2,然后依次输入文件名,写入的字符。如果是想写入字符串,只需将fget()、fput()更改为fgets()、fputs()即可

三、从一个文件写一个字符串到另一个文件

/*功能:两个文件之间的读写
 *实现:从键盘终端输入字符到file1 , 再将一个磁盘文件中的信息复制到另一个磁盘文件file2中。
 *思路:利用fgetc()从file1读取信息,用fputc向file2中写入信息。定义两个文件指针变量分别指向file1,file2.
 *Date:2014.11.21
*/
#include<stdio.h>
#include<stdlib.h>
void main()
{
	FILE *stream1,*stream2;				//文件指针
	char ch,filename1[10],filename2[10];
	printf("请输入文件1名称:\n");
	scanf("%s",filename1);
	printf("请输入文件2名称:\n");
	scanf("%s",filename2);

	/*1.创建(打开)file1文件,并向其写入数据*/

	if((stream1=fopen(filename1,"w+")==NULL))	//以可读写方式打开文件
	{
		printf("打开文件1失败");
		exit(1);
	}
	ch=getchar();		//接收最后输入的回车符,防止回车符被当作第一个字符被写入到文件1中

	printf("请输入要写入的字符数据:\n");
	ch=getchar();		//接收第一个字符
	while(ch!='#')
	{
		fputc(ch,stream1);//写入一个字符到文件1中
		ch=getchar();	  //依次从终端获取一个字符保存到ch中,直到输入'#'字符结束
	}
	fclose(stream1);	  //关闭文件1

	/*2.分别打开文件1和文件2*/

	if((stream1=fopen(filename1,"w+")==NULL))	//以可读写方式打开文件
	{
		printf("打开文件1失败");
		exit(1);
	}
	if((stream1=fopen(filename1,"r+")==NULL))	//以可读写方式打开文件
	{
		printf("打开文件2失败");
		exit(1);
	}
	putchar(10);	//输入一个换行

	/*3.将文件1数据复制到文件2中*/
	while(feof(stream1)!=0)			//判定是否已经达到文件1尾部
	{
		ch=fgetc(stream1);		//调用fgetc()函数从stream1所指的文件1读取一个字符
		fputc(ch,stream2);		//调用fputc()函数将一个字符写入到stream2所指的文件2中
	}
	putchar(10);	//回车符
	fclose(stream1);
	fclose(stream2);//关闭文件1、文件2,释放其所占的资源
}
//编译 gcc test3 -c test3.c
//运行 ./test3

四、读写字符串

/*功能:读写字符串
 *实现:从键盘读入若干个字符串,对他们按字母大小的顺序排序,然后将排序后的结果送到磁盘文件中保存。
 *思路:利用二维数组输入字符串,将排序好的字符串利用fputs(str ,fp)函数将数组中的字符串送到文件中。
 *Date:2014.11.21
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	FILE *stream;				//声明文件指针,用于保存打开文件信息
	int N;
	char str[N][10],temp[10]; 	//声明二维数据存储N个长度为10的字符串,temp为临时变量
	int i,j;
	printf("请输入要写入的若干个字符串\n");

	/*1.向数组str中输入若干个字符串*/

	for(i=0;i<N;i++)
	{
		scanf("%s",&str[i]);	//等价与gets(str[i])
	}

	/*2.对输入的一系列字符串进行由小到大排序:字符串逐一对比*/
	for(i=0;i<N-1;i++)
	{
		for(j=0;i<N;j++)
		{
			if(strcmp(str[i],str[j])>0)		//当i=0时,将第一个字符串逐一与其他字符串对比:如果上一个字符串大于下一个字符串,则调换顺序
			{
				strcpy(temp,str[i]);	    //先将大号放在临时数组
				strcpy(str[i],str[j]);		//再将小号存放前一个数组
				strcpy(str[j],temp);		//最后将存放大号的临时数据字符串存放到后面的数组
			}
		}
	}

	/*3.打开文件已有文件*/
	if((stream=fopen("C:\\test4.txt","w"))==NULL)
	{
		printf("打开C:\\test4.txt失败");
		exit(1);
	}

	printf("字符串排序结果为:\n");
	/*4.在终端显示排序结果,并将其写入文件中*/
	for(i=0;i<N;i++)
	{
		fputs(str[i],stream);	//将字符串逐一写入到文件中,并且每写入一个字符串回车
		fputs("\n",stream);
		puts(str[i]);				//将字符串逐一显示在终端
	}
	putchar(10);	//换行
	fclose(stream); //关闭文件,释放资源
}

//编译 gcc test4 -c test4.c
//允许 ./test4

五、文件读写(以二进制形式)

/*目标:文件读写(使用二进制方式)
 *功能:从键盘输入10个学生有关数据,然把它们转存到磁盘文件1上去,再将文件1内容读出到终端上
 *思路:1 size_t fread(void *buf,size_t size,size_t count,FILE *stream):从文件中读取内容到缓冲区
 *		 size_t fwrite(const void *buf,size_t size,size_t count,FILE *stream):将缓冲区内容写到文件中
 *	   2.利用结构体存储数据,save函数完成转存数据到文件
 *Date:2014.11.21
*/
#include<stdio.h>
#include<stdlib.h>
#define N 10			//10个学生
int i;
/*1.结构体:用于存储学生数据组*/
struct Student{
	char name[10];
	int age;
	char sex;
	char addr[30]
}stu1[N],stu2[N];		//定义两个结构体对象,前者用于存储输入的数据,后者用于保存从文件1中读出的数据

/*2.save子函数:用于处理输入的数据
*/
void save()
{
	//a)先打开一个文件
	FILE *stream1;				//文件指针:保存一个文件的信息
	char filename[15];
	if(stream1=fopen(filename,"wb")==NULL)
	{
		perror("打开文件失败,Sorry!");
		exit(1);
	}
	//b)将10组数据逐一文写入文件1中,依次写一个学生的数据
	for(i=0;i<N;i++)
	{
		if((fwrite(&stu1[i],sizeof(struct Student),1,stream1))!=1)
		{
			perror("Write file1 failed");
		}
	}
	fclose(stream1);						//关闭文件1
	//c)从file1读取数据到缓存stu2[],并显示读到的每组数据
	if(stream1=fopen(filename,"rb")==NULL)  //重新打开文件1
	{
		perror("打开文件失败,Sorry!");
		exit(1);
	}
	for(i=0;i<N;i++)
	{
		fread(&stu2[i],sizeof(struct Student),1,stream1);
		printf("从文件1读到的数据为:%s%d%s%s\n",stu2[i].name,stu2[i].age,stu2[i].sex,stu2[i].addr);
	}
	fclose(stream1);

}

/*3.主函数:只负责输入数据并调用save子函数*/
void main()
{
	printf("请输入10组学生的数据:\n");
	for(i=0;i<N;i++)					//依次输入10组数据,注数组名即数组元素的起始地址
	{
		scanf("%s%d%s%s",stu1[i].name,&stu1[i].age,stu1[i].sex,stu1[i].addr);
	}
	save();	//处理数据
}

//编译:gcc test5 -c test5.c
//运行:./test5

 六、时间编程 

格林威治时间GTC、日历时间

头文件  #include<time.h>

1.时间获取

函数:

time_t time(time_t *tloc)

功能:获取日历时间,即从1970年1月1日0点到现在所经历的秒数。其中time_t为长整型

返回:返回时间

2.时间转化

函数:

struct tm *gmtime(const time_t *timep);

struct tm *localtime(const time_t *timep);

功能:将日历时间(字符串形式)转化为格林时间,并保存到TM结构体中

将日历时间转化为本地时间,并保存到TM结构体中

其中

sruct tm{

int tm_sec; //秒值

int tm_min; //分值

int tm_hour;

int tm_mday;

int tm_mon;

int tm_year;

int tm_wday;

int tm_yday;

int tm_isdst;

};

注释1:type time_t long; 这个是用户自定义类型,是类库提供的头文件,为长整形。

注释2:*gmtime为tm结构体类型指针变量,用于指向结构体。

源代码

**********************************************************************
实现:获取日历时间,并将日历时间转化为本地时间,格林威时间.
思路:time(NULL)-返回time_t类型时间、localtime(&t)/gmtime(&t)-返回时间信息到结构体;
***********************************************************************
#include time.h>
#include stdio.h>
int main()
{
 struct tm *local;       //定义一个结构体指针变量local,用于存放时间信息(转化的时间信息)
 time_t t;         //定义一个time_t类型长整型变量t,用于保存当前日历信息
 *获取时间*
 t=time(NULL);        //调用time()函数,获取当前日历时间信息(即清空历史信息,自动保存当前时间)
 *转化时间*
 local=localtime(&t);      //调用localtime()函数,将转化的本地时间保存到local指向的(struct tm)结构体中
 printf("local time is:%d\n",local->tm_hour); //打印小时
 local=gmtime(&t);       //调用gmtime()函数,转化为UTC时间并保存到local指向的结构体中
 printf("UTC time is:%d\n",local->tm_hour); //打印小时信息
 return 0;         //程序结束
}

3.时间显示

(1)函数

char *asctime(const struct tm *tm)

char *ctime(const time_t *timep)

(2)功能:将tm格式时间转化为字符串,如sat Jul 30:08:43:03 2014

将日历时间转化为本地时间的字符串形式

源代码

**********************************************************************
实现:时间显示.
思路:asctime(display)将tm格式时间转化为字符串输出,ctime(&t)将日历时间转化为字符串输出;
***********************************************************************
#include time.h>
#include stdio.h>
int main(void)
{
 struct tm *display;    //定义一个结构体指针变量display指向struct tm结构体类型
 time_t t;      //定义一个time_t长整型变量t,用于存放当前日历时间
 t=time(NULL);     //获取当前日历时间
 display=gmtime(&t);    //将日历时间转化为UTC时间,并将时间信息保存到dispaly所指向的结构体中
 *时间显示*
 printf(asctime(display));  //将display所指向的tm格式时间转化为字符串显示()
 printf(ctime(&t));    //将日历时间转为本地时间的字符串显示
 return 0;      //程序结束
}


4.获取时间

(1)函数:

int gettimeofday(struct timeval *tv,struct timezone *tz)

(2)功能:获取今日凌晨到现在的时间差,常用语计算时间的耗时

struct timeval

{

int tv_sec;//秒数

int tv_usec;//微秒数

}

struct timezone {

int tz_minuteswest;

int tz_dsttime;

};

源代码

*********************************************************************
实现:计算执行function()函数所消耗的时间.
思路:gettimeofday(struct timeval *tv,struct timezone *tz),获取凌晨到当前时间的时间差;
***********************************************************************
#include stdio.h>
#include stdlib.h>
#include math.h>
#include  sys/timeb.h>
#include  unistd.h>
*将要计算的function函数*
void function()
{
     unsigned int i,j;
     double y;
     for(i=0;i<1000;i++)
      for(j=0;j<1000;j++)
       y++;
}
struct timeval
{
     float _sec;
     float _usec;
}
 main()
{
     struct timeval tpstart,tpend;//定义两个struct timeval类型变量tpstart、tpend,用于存放第一次和第二次时间差(秒 微秒)
     float timeuse;//timeuse为计算消耗时间值
 *function函数所消耗的时间*
     gettimeofday(&tpstart,NULL);//计算当前时间到凌晨的时间差,将获得的时间差存放到结构体struct timeval中
     function();
     gettimeofday(&tpend,NULL);//计算运行function函数后的当前时间到凌晨的时间差,将获得的时间差存放到结构体struct timeval中

 *总时间计算*
     timeuse=(tpend._sec-tpstart._sec)+1000000*(tpend._usec-tpstart._usec);//将微秒化为秒
     printf("The use time:%f\n",timeuse);
     exit(0);    //正常退出
}

 5.延时时间

(1)函数:

unsigned int sleep(unsigned int seconds)

void usleep(unsigned long usec)

(2)功能:使程序睡眠seconds秒

使程序睡眠usecs秒

</pre><pre name="code" class="csharp">
时间: 2024-08-08 22:07:12

深入理解Linux文件系统编程(二)的相关文章

CentOS 7 Linux基本命令(11)深入理解Linux文件系统与日志

深入理解Linux文件系统与日志 一.inode和block概述 文件数据包括元信息与实际数据 元信息:文件的属性信息实际数据:文件内容 文件存储在硬盘上,硬盘最小存储单位是"扇区",每个扇区存储512字节 block(块) 连续的8个扇区组成一个block(4k)是文件存取的最小单位 inode(索引节点) 也叫i节点用于存储文件元信息 1.indoe的内容 inode包含文件的元信息 (1)文件的字节数(2)文件拥有者的User ID(3)文件的Group ID(4)文件的读.写.

Linux网络编程(二)

服务套和客户机的信息函数 1.字节转换函数 在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的, 比如i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反. 为了统一起来,在Linux下面,有专门的字节转换函数. unsigned long int htonl(unsigned long int hostlong)     unsigned short int htons(unisgned short int hostshort)     unsigned

理解Linux文件系统之inode

很少转发别人的文章,但是这篇写的太好了. 理解inode 作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口. 下面就是我的inode学习笔记,尽量保持简单. =================================== 理解inode 作者:阮一峰 一.inode是什么? 理解inode,要从文件储

linux文件系统 - 初始化(二)

一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序.在linux初始化的初级阶段,它提供了一个基本的运行环境.当成功加载磁盘文件系统后,系统将切换到磁盘文件系统并卸载initrd. 如果是嵌入式设备,那么最终的文件系统就是initrd. 二.cpio文件格式 initrd常用的的文件格式是cpio,cpio格式记录了文件系统的结构和内容. cpio格式具

class-4 Linux文件系统(二)及IO重定向

一.文件系统(二) 1.文件通配符 作用:可以批量的选择出符合要求的文件或目录 *  匹配零个或多个字符 ?  匹配任何单个字符 ~  当前用户家目录 ~username  用户家目录 [[email protected] /]# cd ~lvasu [[email protected] lvasu]# ls ~+  当前工作目录 ~- 前一个工作目录 # ls  ~-/issue      [[email protected] ~]# ls   a    anaconda-ks.cfg  in

Linux/Centos7系统管理之深入理解Linux文件系统与日志分析

前言: inode(文件节点)与block(数据块) 硬链接与软连接 恢复误删除的文件 (即rm-rf 的操作,可以先进行备份的操作,然后可以进行恢复ext4和xfs文件系统皆可) 日志文件的分类 用户日志与程序日志 一 :inode和block概述 1.1 概述 文件数据包括元信息与实际数据 文件存储在硬盘上,硬盘最小存储单位是"扇区",每个扇区储存512字节 block(块) 连续的八个扇区组成一个block,一个block单位是4k 是文件存取的最小单位 inode(索引节点)

深入理解Linux文件系统(一)

inode和block概述 文件数据包括元信息与实际数据 文件存储在硬盘上,硬盘最小储存单位是 "扇区",每个扇区储存512字节. block(块)中文译名为"索引节点",也叫i节点用于存储文件元信息 1.inode的内容 inode 包含很多的文件元信息,但不包含文件名,例如文件的字节数文件拥有着的UserID文件的GropuID文件的读.写.执行权限文件的时间戳 目录文件的结构目录也是一种文件目录文件的结构每一个inode都有一个号码,操作系统用inode号码来

深入理解Linux文件系统基础inode

转载自:http://www.ruanyifeng.com/blog/2011/12/inode.html 这篇文章对Inode的讲解比较透彻,好文章分享一下,一是收藏,二是让大家也可以一起学习(已懂的略过),对于一些重点的本人标红,并加些个人的补充. 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是

深入理解Linux文件系统之inode

转载自:http://www.ruanyifeng.com/blog/2011/12/inode.html 这篇文章对Inode的讲解比较透彻,好文章分享一下,一是收藏,二是让大家也可以一起学习(已懂的略过),对于一些重点的本人标红,并加些个人的补充. 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是