⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdwt.c

📁 操作系统课程设计
💻 C
字号:
/*rdwt.c*/
#include <stdio.h>
#include "filesys.h"

unsigned int getfilesize(fp)//~~~~added;
int fp;
{
	struct inode * inode;

	inode=sys_ofile[user[user_id].u_ofile[fp]].f_inode;
	return inode->di_size;
}//~~~~~~~~~~~~

unsigned int read(fp, buf, size) //~~~~edited
int fp;
char * buf;
unsigned int size;
{
	unsigned long off;
	int block, block_off, i, j;
	struct inode * inode;
	char * temp_buf;

	inode=sys_ofile[user[user_id].u_ofile[fp]].f_inode;
	if (!(sys_ofile[user[user_id].u_ofile[fp]].f_flag & FREAD))
	{
		printf ("\nthe file is not opened for read\n");
		return 0;
	}
	temp_buf=buf;
	off = sys_ofile[user[user_id].u_ofile[fp]].f_off;
	if ((off+size)>inode->di_size) size=inode->di_size-off;
	block_off=off % BLOCKSIZ;
	block =off/BLOCKSIZ;
	if (block_off+size<BLOCKSIZ)
	{
		fseek(fd, DATASTART + inode -> di_addr[block] * BLOCKSIZ + block_off, SEEK_SET);
		fread(buf,1, size, fd);

		sys_ofile[user[user_id].u_ofile[fp]].f_off+=size;//~~~

		return size;
	}
	fseek(fd,DATASTART+inode->di_addr[block]*BLOCKSIZ+block_off,SEEK_SET);
	fread(temp_buf,1,BLOCKSIZ-block_off,fd);
	temp_buf+=BLOCKSIZ-block_off;

	block_off=BLOCKSIZ-block_off;

	j= (inode->di_size-off-block_off)/BLOCKSIZ;
	for(i=0; i<((size-block_off) /BLOCKSIZ); i++)
	{
		fseek (fd, DATASTART+inode->di_addr[j+i]*BLOCKSIZ,SEEK_SET);
		fread(temp_buf,1,BLOCKSIZ,fd);
		temp_buf+=BLOCKSIZ;
	}

	block_off=(size-block_off)%BLOCKSIZ;
	block=inode->di_addr[off+size/BLOCKSIZ+ 1];
	fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
	fread(temp_buf,1,block_off,fd);
	sys_ofile[user[user_id].u_ofile[fp]].f_off+=size;
	return size;

}

unsigned int write (fp,buf,size)
int fp;
char * buf;
unsigned int size;
{
	unsigned long off;
	int block,block_off,i;
	struct inode * inode;
	char * temp_buf;
	int rblock;

	inode=sys_ofile[user[user_id].u_ofile[fp]].f_inode;
	if (!((sys_ofile[user[user_id].u_ofile[fp]].f_flag & FWRITE) || (sys_ofile[user[user_id].u_ofile[fp]].f_flag & FAPPEND)) )
	{
		printf("\nWarning!!!\nThe file is not opened for write\n");
		printf("请先创建一个文件!\n");
		return 0;
	}
	temp_buf=buf;

	off=sys_ofile[user[user_id].u_ofile[fp]].f_off; 
	block_off= off % BLOCKSIZ;
	block =off/BLOCKSIZ;

	if (inode->di_size==0)
	{
		rblock=balloc();
		inode->di_addr[0]=rblock;
	}
		
	if (block_off+size<BLOCKSIZ)
	{
		fseek (fd, DATASTART + inode ->di_addr[block] * BLOCKSIZ + block_off, SEEK_SET);
		fwrite(buf, 1, size, fd);

		sys_ofile[user[user_id].u_ofile[fp]].f_off+=size;//~~~
        inode->di_size+=size;
        printf("写完成.\n");
		return size;
	}


	fseek (fd, DATASTART+inode ->di_addr[block] * BLOCKSIZ+block_off, SEEK_SET);
	fwrite(temp_buf, 1, BLOCKSIZ-block_off, fd);
	temp_buf += BLOCKSIZ - block_off;

	block_off=BLOCKSIZ-block_off;

	for (i=0; i<(size-block_off)/BLOCKSIZ;i++)
	{
		inode->di_addr[block+1+i]=balloc( );
		fseek(fd ,DATASTART+inode ->di_addr[block + 1 +i] * BLOCKSIZ, SEEK_SET);
		fwrite(temp_buf, 1, BLOCKSIZ, fd);
		temp_buf += BLOCKSIZ;
	}

	block_off = (size-block_off) % BLOCKSIZ;
	if (block_off!=0){
		block = inode ->di_addr[off+size/BLOCKSIZ + 1];
		fseek (fd ,DATASTART+block * BLOCKSIZ ,SEEK_SET);
		fwrite(temp_buf,1 ,block_off, fd);
	}
		sys_ofile[user[user_id].u_ofile[fp]].f_off += size;

	inode->di_size+=size;
    printf("写完成.\n");
	return size;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -