文件编程(一)

1、系统调用

所有的操作系统都提供多种服务的入口点,程序由此向内核请求服务。

这些可直接进入内核的入口点被称为系统调用。


2、Linux下文件操作的系统调用

(1)open():

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

int main()
{
	int fd = open("test1", O_RDWR|O_CREAT, 0777);
	if(fd == -1)
	{
		perror("open");
		return -1;
	}
	
	printf("fd = %d\n",fd);
	printf("文件打开成功\n");
	
	close(fd);
	
    return 0;
}


(2)read():

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

#define SIZE 1024

int main1()
{
	
	int fd = open("BTree.c", O_RDONLY, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	
	char buf[SIZE] = {0};
	ssize_t ret = read(fd, buf, SIZE-1);
	if (ret == -1)
	{
		perror ("read");
	}
	
	// 返回值为0 代表读到文件结尾
	if (ret == 0)
	{
		printf ("文件读取结束\n");
	}
	
	printf ("len = %d\n", strlen(buf));
	printf ("读到 %d 字节: %s\n", ret, buf);
	
	
	return 0;
}

// 缓冲区覆盖问题
int main2()
{
	
	int fd = open("BTree.c", O_RDONLY, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	
	char buf[SIZE] = {0};
	
	while (1)
	{
		ssize_t ret = read(fd, buf, SIZE-1);
		if (ret == -1)
		{
			perror ("read");
		}
		
		// 返回值为0 代表读到文件结尾
		if (ret == 0)
		{
			printf ("文件读取结束\n");
			break;
		}
		
		//printf ("len = %d\n", strlen(buf));
		// printf ("读到 %d 字节: %s\n", ret, buf);
		printf ("%s", buf);
	}

	
	
	return 0;
}
// 读取数据之前清空缓冲区
int main3()
{
	
	int fd = open("BTree.c", O_RDONLY, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	
	char buf[SIZE] = {0};
	
	while (1)
	{
		memset (buf, 0, SIZE);   // 清空缓冲区
		ssize_t ret = read(fd, buf, SIZE-1);
		if (ret == -1)
		{
			perror ("read");
		}
		
		if (ret == 0)
		{
			printf ("文件读取结束\n");
			break;
		}
		printf ("%s", buf);
	}

	
	
	return 0;
}

// 每次读完数据之后将下一个字节置为 '\0';
int main4()
{
	
	int fd = open("BTree.c", O_RDONLY, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	
	char buf[SIZE] = {0};
	
	while (1)
	{
		ssize_t ret = read(fd, buf, SIZE-1);
		if (ret == -1)
		{
			perror ("read");
		}
		
		if (ret == 0)
		{
			printf ("文件读取结束\n");
			break;
		}
		buf[ret] = '\0';
		printf ("%s", buf);
	}

	
	
	return 0;
}

// 读一个完整的大数据
int main()
{
	
	int fd = open("BTree.c", O_RDONLY, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	
	char buf[SIZE] = {0};
	char *p = buf;  
	int count = SIZE-1;  // 每一次要读的数据个数
	ssize_t ret = 0;
	while (ret = read(fd, p, count))
	{
		// 出错
		if (ret == -1)
		{
			if (errno == EAGAIN || errno == EINTR) 
			{
				continue;
			}
			break;
		}
		printf ("asdasdsadsa\n");
		// 读完
		if (count == ret)
		{
			break;
		}
		count -= ret;   // 下一次要读的数据
		p += ret;
	}

	printf ("len = %d\n", strlen(buf));
	//printf ("%s\n", buf);

	return 0;
}


(3)write():

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

#define SIZE 1024

int main()
{
	int fd = open("abc", O_WRONLY|O_CREAT, 0777);
	if (fd == -1)
	{
		perror ("open");
		return -1;
	}
	char buf[SIZE] = {0};
	
	while (1)
	{
		fgets (buf, SIZE, stdin);
		if (strncmp ("end", buf, 3) == 0)
			 break;
		
		ssize_t ret = write(fd, buf, strlen(buf));
		if (ret == -1)
		{
			perror ("write");
		}
		
		printf ("要写的字节数 :%d,  实际写的字节数: %d\n", SIZE, ret);
	}
	

	
	close(fd);
	return 0;
}

(4)lseek():

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

#define SIZE 1024

int main()
{
	// 打开要读的文件
	int fd = open("abc2", O_RDWR|O_CREAT, 0777);
	if (fd == -1)
	{
		perror ("open fd1");
		return -1;
	}
	
	// 设置这个文件的偏移指针
	lseek (fd, 20, SEEK_SET);
	
	char *buf = "hello";
	
	write (fd, buf, strlen(buf));
	
	close (fd);
	return 0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值