只总结了部分常用的内容,详细内容参考《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(&lt);
printf(asctime(ptr));
printf(ctime(&lt)); 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系统编程@文件操作(一)的更多相关文章

  1. Linux系统编程--文件IO操作

    Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...

  2. Xshell6远程访问linux及Xftp6远程针对linux系统中文件操作(附图文详解)

    1.首先我们需要先做好前期准备工作,需要到XManager6官网上将Xshell及Xftp下载并安装,安装过程一直下一步就好了.这里是其官网:http://www.xshellcn.com/.安装完成 ...

  3. linux系统编程--文件IO

    系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...

  4. Linux系统编程--文件描述符的复制dup()和dup2()【转】

    本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...

  5. [Linux] Linux系统(文件操作)

    linux有三种文件类型,普通文件,目录,设备文件 查看文件 使用命令ls获取ll,查看文件列表,参数:-l(列表形式),-a(展示隐藏文件) 使用元字符* ? ,查看匹配的文件列表,例如:ll a* ...

  6. Linux系统编程---文件I/O(open、read、write、lseek、close)

    文件描述符 定义:对内核而言,文件描述符相当于一个文件的标识,它是一个非负整数,当打开(open)一个现有文件或者创建(creat)一个新文件时,内核会向进程返回一个文件描述符 在unix中(文件描述 ...

  7. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  8. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的.           库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...

  9. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

随机推荐

  1. iOS网页开发技术总结

    网页组成 一个有具体功能的完整的网页,一般由3部分组成 HTML:网页的具体内容和结构 CSS:网页的样式(美化网页最重要的一块) JavaScript:网页的交互效果,比如对用户鼠标事件做出响应 H ...

  2. opencv中的Mat类型

    Mat类型主要是跟matlab中的数据类型一样.故用起来很方便. Mat最大的优势跟STL很相似,都是对内存进行动态的管理,不需要之前用户手动的管理内存,对于一些大型的开发,有时候投入的lpImage ...

  3. 《JAVA学习笔记 (final关键字)》

    [14-9]面向对象-final关键字 /* 继承的弊端,打破封装性. 不让其他类继承该类,就不会有重写. 怎么能实现呢?通过Java中的一个关键子来实现,final(最终化). [final关键字] ...

  4. JS 中的五个假值

    1."", undefined, null, 0, NaN 除了这五个假值以外,其他所有值转布尔类型都是true.还有一个特殊的false.

  5. Canopy v. 1.5.5 ubuntu安装流程

    官网的下载超级慢,还总是断,一断就失败了 我花费了7个小时终于在尝试了5次以后下载成功了,现在将网盘链接分享出来 https://yunpan.cn/cxt28gM26mxQU  访问密码 301d ...

  6. 补码复习的好例子---Int范围的科学解释

    Int范围的科学解释 这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767 最小为1111111111111111=-2的15 ...

  7. Python学习路程day4

    迭代器&生成器 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. ...

  8. HDU 圆桌会议 - 数学题

    圆桌   题意就是每分钟可以将相邻的两个人的位置互换一下 , 问你 ,几分钟可以将所有人的位置互换成    原先的  B 在A的右边 C在A的左边 , 换成现在的 C 在A 的右边 , B 在 A 的 ...

  9. ASP.NET之Ajax系列(一)

    我们在Web开发中经常会接触到Ajax技术,同时Ajax技术也有很多种实现方式,那么,我们今天从第一种方式说起:ASP.NET原生控件实现Ajax. ASP.NET原生控件用于Ajax技术的主要是Up ...

  10. Monogb基本概念及基本操作

    MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...