ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux 文件编程

2022-02-25 21:33:32  阅读:256  来源: 互联网

标签:文件 int 编程 bytes read fd Linux include


Linux文件操作

1.linux,一切皆为文件

2.Linux文件可分为:普通文件,目录文件,链接文件,设备文件;

d:目录文件;

l:链接文件;

p:管道文件

s:套接字

c:字符设备;

b:块设备;

p:管道文件,如FIFO文件;

f:堆栈文件,如LIFO

d:表示目录文件

c/b:表示设备文件

3.文件描述符是一个非负的整数,它是一个索引值,并指向内核中每个进程的记录表中;

4.一个进程启动时,都会打开三个文件:

        标准输入:       STDIN_FILENO                 0

        标准输出:       STDOUT_FILENO             1

        标准出错处理:STDERR_FILENO             2

5.creat函数

int creat(const char *filename,mode_t mode)

filename:创建的文件名(包含路径,缺省为当前路径)mode:创建模式

常用创建模式(除了宏定义也可用数字表示 )

S_IRUSR      可读      

S_IWUSR     可写      

S_IXUSR      可执行  

S_IXRWU     可读可写可执行 

6.open函数

int open(const char * pathname,int flags);

int open(const char * pathname,int flags,mode_t mode);

返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

pathname是要打开或创建的文件的名字

flags参数可用来说明此函数的多个选择项

  • flags参数

        O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其           说明该新文件的存取权限。 

        O_EXCL | O_CREAT 不能单独使用,根O_creat一起使用

        加上O_EXCL 指定文件存在就会出错 没报错 即创建新文件

        O_NONBLOCK 如果pathname指的是一个块特殊文件或一个字符特殊文件,则此选择项为

        此文件的本次打开操作和后续的I/O操作设置非阻塞方式(空文件,没读到,非阻塞,直接返            回 0);不加默认阻塞(阻塞的话read停在这等待读)。

       O_TRUNC 把打开的文件长的截断为0,清空文件内所有内容。(不能跟只读一起用)

        以下三个常数中必须指定一个,且仅允许指定一个(这些常数定义在<fcntl.h>头文件中)

O_RDONLY   只读打开

O_WRONLY  只写打开

O_RDWR       读、写打开

 mode对于open函数而言,仅当创建新文件时才使用第三个参数

mode创建模式

        S_IRUSR    可读

        S_IWUSR     可写

        S_IXUSR      可执行

        S_IXRWU     可读、可写、可执行

 7.close函数

int close(int fd) fd: 文件描述符,来源

open 返回值文件描述符

8.read函数

int read(int fd,const void *buf,size_t length)

功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数

返回值: -1(出错)

9.write函数

int read(int fd,const void *buf,size_t length)

功能:   从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。

返回值: -1(出错) length 0length = 0时,返回0

10.lseek函数

int lseek(int fd,offset_t offset, int whence)

功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置

whence可使用下述值:

SEEK_SET:相对文件开头

SEEK_CUR:相对文件读写指针的当前位置

SEEK_END:相对文件末尾

offset可取负值,表示向前移动。例如下述调用

可将文件指针相对当前位置向前移动5个字节:

lseek(fd, -5, SEEK_CUR)

lseek来计算文件长度:

  • 由于lseek函数的返回值为文件指针相对于文件头的位置,因此下面调用的返回值就是文件的长度: lseek(fd, 0, SEEK_END)

11.file_copy.c实现文件内容拷贝

#include <stdio.h>
#include <stdlib.h>

//系统调用函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>//read,write,close头文件
#include <errno.h>
#include <string.h>

#define BUFFER_SIZE 1024

int main(int argc, const char *argv[])
{
	int from_fd,to_fd;
	int bytes_read,bytes_write;
	char buffer[BUFFER_SIZE];//数据缓存区
	char *ptr;

	if(argc != 3)
	{
		fprintf(stderr,"usage:%s \n\a",argv[0]);
		exit(1);
	}

	if((from_fd = open(argv[1],O_RDONLY)) == -1)
	{
		fprintf(stderr,"open %s Error:%s\n",argv[1],strerror(errno));
		exit(1);
	}

	if((to_fd = open(argv[2],O_RDWR | O_CREAT,S_IRUSR | S_IWUSR)) == -1)
	{
		fprintf(stderr,"open %s Error:%s\n",argv[2],strerror(errno));
		exit(1);
	}

	while(bytes_read = read(from_fd,buffer,BUFFER_SIZE))
	{
		if((bytes_read == -1) && (errno != EINTR))
		{
			break;
		}

		else if(bytes_read > 0)
		{
			ptr = buffer;
			while(bytes_write = write(to_fd,ptr,bytes_read))
			{
				if((bytes_write == -1) && (errno != EINTR))
				{
					break;
				}

				else if(bytes_write > 0)
				{
					ptr += bytes_write;
					bytes_read -= bytes_write;
				}

				if(bytes_write == -1)
				{
					break;
				}
			}
		}
	}

		close(from_fd);
		close(to_fd);

	return 0;
}

C库函数

1.C库函数的文件操作是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数。

2.

FILE *fopen(const char *filename, const char *mode)

filename:打开的文件名(包含路径,缺省为当前路径)

mode:打开模式

“r” :只读,文件必须已存在

“w”:只写,如果文件不存在则创建,如果文件已存在则把文件长度截断(Truncate)为0字节再重新写,也就是替换掉原来的文件内容

“a”:只能在文件末尾追加数据,如果文件不存在则创建

“r+”:允许读和写,文件必须已存在

“w+”:允讲读和写,如果文件不存在则创建,如果文件已存在则把文件长度截断为0字节再重新写

“a+”:允许读和追加数据,如果文件不存在则创建

b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但Linux不区分二进制文件和文本文件(不需要写"b")

3.fwrite函数

size_t fwrite(const void * ptr,size_t size, size_t n,FILE * stream)

功能:从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节,返回实际写入的字段数

4.fread函数

size_t  fread(void *ptr,size_t size,size_t n, FILE * stream)

 功能: 从stream指向的文件中读取n个字段,每字段为size字节,并将读取的数据放入ptr所指的字符数组中,返回实际已读取的字段数。

5.C库函数实现file_copy.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	FILE *fp_from;
	FILE *fp_to;
	char ch;
	if((fp_from = fopen("test1.txt","w+")) == NULL)
	{
		printf("Can not open file strike and key exit!");
		exit(1);
	}

	if((fp_to = fopen("test2.txt","w+")) == NULL)
	{
		printf("Can not open file strike and key exit!");
		exit(1);
	}

	printf("please input character in test1\n");
	ch = getchar();
	while(ch != '\n')
	{
		fputc(ch,fp_from);
		ch = getchar();
	}

	ch = fgetc(fp_from);
	while(ch != EOF)
	{
		fputc(ch,fp_to);
		ch = fgetc(fp_from);
	}

	fclose(fp_from);
	fclose(fp_to);

	return 0;
}

三hello

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define BUFFER_SIZE 1024


int main(int argc, const char *argv[])
{
	int fd;
	int i;
	int bytes_read;

	char buffer[BUFFER_SIZE];//数据缓存区
	char *ptr = "hello";

	if((fd = open("hello.txt",O_RDWR | O_CREAT,S_IRUSR | S_IWUSR | S_IXUSR)) == -1)
	{
		perror("open error!\n");
		exit(-1);
	}

	for(i = 0; i < 3; i++)
	{
		write(fd,ptr,5);//将ptr中的5个字节写入fd
		write(fd,"\n",1);//将一个'\n'写入fd,实现换行功能
	}

	lseek(fd,0,SEEK_SET);//定位文件读写指针

	for(i = 0; i < 3; i++)
	{
		bytes_read = read(fd,buffer,6);//从fd中读取6个字节到缓存区

		if(-1 == bytes_read)
		{
			perror("read error!\n");
			break;
		}
		write(1,buffer,6);//将缓存区的6个字节写到屏幕上
	}

	close(fd);

	return 0;
}

标签:文件,int,编程,bytes,read,fd,Linux,include
来源: https://blog.csdn.net/weixin_57167884/article/details/123126470

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有