Linux系统编程@文件操作(一)
只总结了部分常用的内容,详细内容参考《UNIX环境高级编程》及相关书籍。
Linux中文件编程可以使用两种方法
- Linux系统调用(依赖于系统)
- C语言库函数(不依赖于系统)
Linux系统调用实现文件编程(man 2)
函数详见 man 2 funcname
文件的创建
int creat(const char *filename, mode_t mode)
filename: 要创建的文件名
mode:创建模式 (S_IRUSR/S_IWUSR/S_IXUSR/S_IRWXU) //mode_t 无符号整形 (0755怎么解释)
用数字表示 1 2 4 7
文件的描述
所有打开文件都对应一个文件描述符。文件描述符是一个非负整数。打开文件时由系统来分配。文件描述符范围为0-OPEN_MAX,现在很多系统中OPEN_MAX=1023。
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode); //此处mode用于以O_CREAT方式打开的文件,用于指定新建文件的权限
pathname:包含路径的文件名
flags:打开标志(O_RDONLY/O_WRONLY/O_RDWR/O_APPEND/O_CREAT/O_NONBLOCK)
0 1 2 追加方式 创建文件 非阻塞方式
文件的关闭
int close(int fd);
文件的内容读取(读位置为文件读写指针所指位置)
int read(int fd, const void *buf, size_t length);
从fd中读取length长度字节到buf指向的缓冲区,返回实际读取字节数。
读取完后返回值为0。 //while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) 读完后bytes_read=0,false,退出循环。
不能保证一次性读完文件的情况下可以循环调用read,直至读写完毕。
文件的内容写入(写位置为文件读写指针所指位置)
int write(int fd,const void *buf, size_t length);
从buf指向的缓冲区中取length个字节写入fd文件中,返回实际写入字节数。
文件的读写指针定位
int lseek(int fd, offset_t offset, int whence); 例:lseek(fd,-1,SEEK_END);
将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。
offser可取负值
whence值:SEEK_SET/SEEK_CUR/SEEK_END
使用lseek计算文件长度 lseek(fd,0,SEEK_END);
文件访问判断
int access(const char* pathname, int mode);
判断文件是否可以进行某种操作(读写等),成功后返回0,否则-1.
pathname:包含路径的文件名
mode:要判断的权限。 R_OK 文件可读; W_OK 文件可写; X_OK 文件可执行; F_OK 文件存在
文件操作练习
通过文件操作系统调用实现文件的拷贝。
Linux库函数实现文件访问 (man 3)
文件打开
FILE *fopen(const char* filename, const char* mode )
文件读操作
size_t fread(void *ptr, size_t size, size_t n,FILE *stream)
从stream指向的文件中读取n个字段,每个字段为size字节,并将读取的数据放入ptr所指的字符数组中,返回实际已读取的字节数。
文件写
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
读字符
int fgetc(FILE *stream)
写字符
int fputc(int c,FILE *stream)
向指定文件中写一个字符,例 fputc(ch,fp); //char ch; FILE *fp;
格式化读
fscanf(FILE *stream, char *format[,argument...])
从一个流中进行格式化输入
格式化输出
int fprintf(FILE *stream,char *format[,argument...])
格式化输出到一个流中 例:fprintf(stream,"%s%c",s,c)
文件读写定位
int fseek(FILE *stream,long offset, int whence)
whence: SEEK_SET/SEEK_CUR/SEEK_END
路径的获取
char *getcwd(char *buffer,size_t size)
size是buffer的大小。
创建目录
int mkdir(char *dir,int mode)
返回值:0:成功 -1:出错
时间编程
UTC:标准时间
日历时间:从1970.1.1 0点到现在的秒数。
时间获取
time_t time(time_t *tloc) //typedef long time_t
获取日历时间
时间转化
struct tm *gmtime(const time_t *timep)
将日历时间转化为格林威治标准时间,并保存到TM结构中
struct tm *localtime(const time_t *timep)
将日历时间转化为本地时间,并保存到TM结构。
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year; //tm_year +1900=哪一年
int tm_wday;
int tm_yday;
int tm_isdst;
};
#include <time.h>
#include <stdio.h> int mian(){
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}
时间显示
char *asctime(const struct tm *tm)
将tm格式的时间转化为字符串
char *ctime(const struct time_t *timep)
将日历时间转化为本地时间的字符串形式
#include <time.h>
#include <stdio.h> int main(){
struct tm *ptr;
time_t lt; lt=time(NULL);
ptr=gmtime(<);
printf(asctime(ptr));
printf(ctime(<)); return 0;
}
获取凌晨到现在的时间差
int gettimeofday(stuct timeval *tv, struct timezone *tz)
功能:获取从今日凌晨到现在的时间差,常用于计算事件耗时。时间差记录到tv指向的空间。tz时区
struct timeval{
int tv_sec; //秒数
int tv_usec; //微秒数
};
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h> void function()
{
unsigned int i,j;
double y;
for(i=0;i<1000;i++)
for(j=0;<1000;j++)
y++;
main()
{
struct timeval tpstart ,tpend;
float timeuse; gettimeofday(&tpstart,NULL);
function();
gettimeofday(&tpstart,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Used Time: %f\n",timeuse); exit(0);
}
延时执行
unsigned int sleep(unsigned int seconds) //使程序睡眠seconds秒
void usleep(unsigned long usec) //使程序睡眠usec微秒
Linux系统编程@文件操作(一)的更多相关文章
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
- Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)
1.首先我们需要先做好前期准备工作,需要到XManager6官网上将Xshell及Xftp下载并安装,安装过程一直下一步就好了.这里是其官网:http://www.xshellcn.com/.安装完成 ...
- linux系统编程--文件IO
系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...
- [Linux] Linux系统(文件操作)
linux有三种文件类型,普通文件,目录,设备文件 查看文件 使用命令ls获取ll,查看文件列表,参数:-l(列表形式),-a(展示隐藏文件) 使用元字符* ? ,查看匹配的文件列表,例如:ll a* ...
- Linux系统编程---文件I/O(open、read、write、lseek、close)
文件描述符 定义:对内核而言,文件描述符相当于一个文件的标识,它是一个非负整数,当打开(open)一个现有文件或者创建(creat)一个新文件时,内核会向进程返回一个文件描述符 在unix中(文件描述 ...
- Linux C 程序 文件操作(Linux系统编程)(14)
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...
- Linux C高级编程——文件操作之系统调用
Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的. 库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...
- linux系统编程之文件与io(五)
上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...
随机推荐
- webview上传图片
import java.io.File; import android.annotation.SuppressLint;import android.app.Activity;import andro ...
- HDU 1045 - Fire Net (最大独立集)
题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝 ...
- 5月18日:top10面试算法-LRUcache的实现
问题描述: LRU算法:优先把那些最长时间没使用的对象置换掉.根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. JAVA实现: 测试: publ ...
- 2016-1-9 Quartz框架的学习,写字板demo
一:自定义view .h文件中代码如下 #import <UIKit/UIKit.h> @interface ZLpaintView : UIView @property(nonatomi ...
- 极客DIY:打造属于自己的无线移动渗透测试箱
本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱” ...
- Osmocom-BB中cell_log的多种使用姿势
转载留做备份,原文地址:http://92ez.com/?action=show&id=23342 翻阅osmocom-bb源码的时候注意到,在cell_log中有非常多我们从来没有注意到的功 ...
- java删除指定目录及其文件
import java.io.File; public class Test { public static void main(String args[]){ Test t = new Test() ...
- 我与python3擦肩而过(三)—— 我去。。又是编码问题——urllib.parse.unquote
记得初学python时就学的爬虫,经常遇到编码问题(其实在python3里面编码问题已经很少了...),用requests库就挺方便解决这些问题的.近来有共同学习python的程序员写了个电子书网站, ...
- ViewBag、ViewData和TempData的使用和区别
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData. MVC3中保留了ViewData的使用. ViewBag 是动态类型(dynamic),ViewData ...
- # 20145210 《Java程序设计》第04周学习总结
教材学习内容总结 第六章 继承 •继承:继承基本上就是避免多个类间重复定义共同行为. 我理解的就是:在编写程序的过程中可能会出现部分代码重复的现象,把重复的部分单独定义为一类(父类),在其他代码中(子 ...