搜档网
当前位置:搜档网 › 文件的读写与上锁

文件的读写与上锁

文件的读写与上锁
文件的读写与上锁

1. 实验目的

通过编写文件读写及上锁的程序,进一步熟悉Linux中文件I/O相关的应用开发,并且熟练掌握open()、read()、write()、fcntl()等函数的使用。

2. 实验内容

在Linux中FIFO(先进先出)是一种进程间的管道通信机制。本实验通过使用文件操作,仿真FIFO结构以及生产者-消费者运行模型。

3. 实验步骤

(1)流程图

该实验流程图如图所示

(2)程序说明

本实验需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一个文件进行读写操作。因为这个文件是临界资源,所以可以使用文件锁机制保证两个进程对文件的访问都是原子操作。

先启动生产者进程,它负责创建仿真FIFO结构文件(实际是一个普通文件)并投入生产,就是按照给定的时间间隔,向FIFO文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期1S,要生产的资源数为10个字符)。

后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕显示,然后从文件中删除刚才消费过的数据。为了仿真FIFO结构,此时需要使用两次复制来实现文件内容的偏移。每次消费的资源数通过参数传递给进程,默认值为10个字符。

(3)代码

/* */

int lock_set(int fd, int type)

{

struct flock old_lock, lock;

= SEEK_SET;

= 0;

= 0;

= type;

= -1;

/* 判断文件是否可以上锁 */

fcntl(fd, F_GETLK, &lock);

if != F_UNLCK)

{

/* 判断文件不能上锁的原因 */

if == F_RDLCK) /* 该文件已有读取锁 */

{

printf("Read lock already set by %d\n", ;

}

else if == F_WRLCK) /* 该文件已有写入锁 */

{

printf("Write lock already set by %d\n", ;

}

}

/* l_type 可能已被F_GETLK修改过 */

= type;

/* 根据不同的type值进行阻塞式上锁或解锁 */ if ((fcntl(fd, F_SETLKW, &lock)) < 0)

{

printf("Lock failed:type = %d\n", ;

return 1;

}

switch

{

case F_RDLCK:

{

printf("Read lock set by %d\n", getpid()); }

break;

case F_WRLCK:

{

printf("Write lock set by %d\n", getpid()); }

break;

case F_UNLCK:

{

printf("Release lock by %d\n", getpid());

return 1;

}

break;

default:

break;

}/* end of switch */

return 0;

}

本实验中的生产者程序的源代码如下所示,其中用到的lock_set()函数。/* */

#include <>

#include <>

#include <>

#include <>

#include <>

#include ""

#define MAXLEN 10 /* 缓冲区大小最大值*/

#define ALPHABET 1 /* 表示使用英文字符 */

#define ALPHABET_START 'a' /* 头一个字符,可以用 'A'*/

#define COUNT_OF_ALPHABET 26 /* 字母字符的个数 */

#define DIGIT 2 /* 表示使用数字字符 */

#define DIGIT_START '0' /* 头一个字符 */

#define COUNT_OF_DIGIT 10 /* 数字字符的个数 */

#define SIGN_TYPE ALPHABET /* 本实例选用英文字符 */

const char *fifo_file = "./myfifo"; /* 仿真FIFO文件名 */

char buff[MAXLEN]; /* 缓冲区 */

/* 功能:生产一个字符并写入到仿真FIFO文件中 */

int product(void)

{

int fd;

unsigned int sign_type, sign_start, sign_count, size;

static unsigned int counter = 0;

/* 打开仿真FIFO文件 */

if ((fd = open(fifo_file, O_CREAT|O_RDWR|O_APPEND, 0644)) < 0) {

printf("Open fifo file error\n");

exit(1);

}

sign_type = SIGN_TYPE;

switch(sign_type)

{

case ALPHABET:/* 英文字符 */

{

sign_start = ALPHABET_START;

sign_count = COUNT_OF_ALPHABET;

}

break;

case DIGIT:/* 数字字符 */

{

sign_start = DIGIT_START;

sign_count = COUNT_OF_DIGIT;

}

break;

default:

{

return -1;

}

}/*end of switch*/

sprintf(buff, "%c", (sign_start + counter)); counter = (counter + 1) % sign_count;

lock_set(fd, F_WRLCK); /* 上写锁*/

if ((size = write(fd, buff, strlen(buff))) < 0) {

printf("Producer: write error\n");

return -1;

}

lock_set(fd, F_UNLCK); /* 解锁 */

close(fd);

return 0;

}

int main(int argc ,char *argv[])

{

int time_step = 1; /* 生产周期 */

int time_life = 10; /* 需要生产的资源数 */

if (argc > 1)

{

sscanf(argv[1], "%d", &time_step);

}

if (argc > 2)

{

sscanf(argv[2], "%d", &time_life);

}

while (time_life--)

{

if (product() < 0)

{

break;

}

sleep(time_step);

}

exit(EXIT_SUCCESS);

}

本实验中的消费者程序的源代码如下所示。

/* */

#include <>

#include <>

#include <>

#include <>

#define MAX_FILE_SIZE 100 * 1024 * 1024 /* 100M*/

const char *fifo_file = "./myfifo"; /* 仿真FIFO文件名 */ const char *tmp_file = "./tmp"; /* 临时文件名 */

/* 资源消费函数 */

int customing(const char *myfifo, int need)

{

int fd;

char buff;

int counter = 0;

if ((fd = open(myfifo, O_RDONLY)) < 0)

{

printf("Function customing error\n");

return -1;

}

printf("Enjoy:");

lseek(fd, SEEK_SET, 0);

while (counter < need)

{

while ((read(fd, &buff, 1) == 1) && (counter < need))

{

fputc(buff, stdout); /* 消费就是在屏幕上简单的显示 */

counter++;

}

}

fputs("\n", stdout);

close(fd);

return 0;

}

/* 功能:从sour_file文件的offset偏移处开始将count字节大小的数据拷贝到dest_file文件 */

int myfilecopy(const char *sour_file, const char *dest_file, int offset, int count, int copy_mode)

{

int in_file, out_file;

int counter = 0;

char buff_unit;

if ((in_file = open(sour_file,O_RDONLY|O_NONBLOCK))<0)

{

printf("Function myfilecopy error in source file\n"); return -1;

}

if((out_file=open(dest_file,

O_CREAT|O_RDWR|O_TRUNC|O_NONBLOCK, 0644)) < 0)

{

printf("Function myfilecopy errorin

destination file:");

return -1;

}

lseek(in_file, offset, SEEK_SET);

while((read(in_file,&buff_unit,1)==1)&&(counter

write(out_file, &buff_unit, 1);

counter++;

}

close(in_file);

close(out_file);

return 0;

}

/* 功能:实现FIFO消费者 */

int custom(int need)

{

int fd;

/* 对资源进行消费,need表示该消费的资源数目 */

customing(fifo_file, need);

if ((fd = open(fifo_file, O_RDWR)) < 0)

{

printf("Function myfilecopy error in source_file:");

return -1;

}

/* 为了模拟FIFO结构,对整个文件内容进行平行移动 */

lock_set(fd, F_WRLCK);

myfilecopy(fifo_file, tmp_file, need, MAX_FILE_SIZE, 0); myfilecopy(tmp_file, fifo_file, 0, MAX_FILE_SIZE, 0);

lock_set(fd, F_UNLCK);

unlink(tmp_file);

close(fd);

return 0;

}

int main(int argc ,char *argv[])

{

int customer_capacity = 10;

if (argc > 1) /* 第一个参数指定需要消费的资源数目,默认值为10 */ {

sscanf(argv[1], "%d", &customer_capacity);

}

if (customer_capacity > 0)

{

custom(customer_capacity);

}

exit(EXIT_SUCCESS);

}

4、实验结果

此实验的运行结果如下所示。实验结果会和这两个进程运行的具体过程相关。终端一:

# ./producer 1 15 /*生产周期为1S,需要生产的资源数为20个*/

Write lock set by 11867

Release lock by 11867

……

终端二:

# ./customer 5 /*需要消费的资源数为5个*/

Enjoy:abcde

Write lock set by 11879

Release lock by 11879

C语言程序中关于文件的操作

文件操作函数C语言(FILE fputc fgetc fputs fgets fscanf fprintf) 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct{ int level;/*fill/empty level of buffer*/ unsigned flags;/*File status flags*/ char fd;/*File descriptor*/ unsigned char hold;/*Ungetc char if no buffer*/ int bsize;/*Buffer size*/ unsigned char_FAR*buffer;/*Data transfer buffer*/ unsigned char_FAR*curp;/*Current active pointer*/ unsigned istemp;/*Temporary file indicator*/ short token;/*Used for validity checking*/ }FILE;/*This is the FILE object*/ FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能 fopen()打开流 fclose()关闭流 fputc()写一个字符到流中 fgetc()从流中读一个字符 fseek()在流中定位到指定的字符 fputs()写字符串到流 fgets()从流中读一行或指定个字符 fprintf()按格式输出到流 fscanf()从流中按格式读取 feof()到达文件尾时返回真值 ferror()发生错误时返回其值 rewind()复位文件定位器到文件开始处 remove()删除文件 fread()从流中读指定个数的字符 fwrite()向流中写指定个数的字符 tmpfile()生成一个临时文件流 tmpnam()生成一个唯一的文件名 下面就介绍一下这些函数 1.fopen() fopen的原型是:FILE*fopen(const char*filename,const char*mode),fopen实现三个功

C语言读写文件操作

C语言读写文件操作 #include #include #include FILE *stream;//, *stream2; FILE *stream2; void main( void ) { int numclosed; char *list; list="这个程序由czw编写"; //试图打开文件data.txt,如果该文件不存在,则自动创建 if( (stream= fopen( "data.txt", "r" )) == NULL ) { printf( "试图打开'data.txt'\n" ); printf( "'data.txt'不存在\n" ); printf( "'data.txt'被创建\n" ); } else printf( "'data.txt'被打开\n" ); //以写入方式打开 if( (stream2 = fopen( "data.txt", "w+" )) == NULL ) printf( "'data.txt'不存在\n" ); else { printf( "'data.txt'成功被打开\n" ); fwrite(list,strlen(list),30,stream2); printf("写入数据成功\n"); } //如果文件data.txt存在,就会打开成功,则stream!=NULL,这时就关闭stream if (stream!=NULL) if( fclose( stream) ) printf( "文件流 stream 被关闭\n" ); //关闭所有打开的文件流,返回关闭的文件流个数 numclosed = _fcloseall( );

Linux下C语言的文件读写

Linux下C语言的文件(fputc,fgetc,fwrite,fread对文件读写操 作) //================================== fputc 向文件写入字符 #include #include main() { FILE *fp; char ch; if((fp=fopen("test.txt","w"))==NULL) { printf("不能打开文件\n"); exit(0); } while ((ch=getchar())!='\n') fputc( ch, fp ); fclose(fp); } ------------- 小提示: fp=fopen("test.txt","w") ,把"w"改为"a" 可以创建文件并且追加写入内容 exit(0); 需要包含stdlib.h 头文件,才能使用 //============================================================ fgetc 读取字符 #include #include main( int argc, char *argv[] ) { char ch;

FILE *fp; int i; if((fp=fopen(argv[1],"r"))==NULL) { printf("不能打开文件\n"); exit(0); } while ((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); } 文件结尾,通过判断EOF //============================================================== fwrite 的使用 使数组或结构体等类型可以进行一次性读写 #include #include main() { FILE *fp1; int i; struct student{ char name[10]; int age; float score[2]; char addr[15]; }stu; if((fp1=fopen("test.txt","wb"))==NULL) { printf("不能打开文件"); exit(0); } printf("请输入信息,姓名年龄分数1 分数2 地址:\n"); for( i=0;i<2;i++) { scanf("%s %d %f %f %s",https://www.sodocs.net/doc/fb14923238.html,,&stu.age,&stu.score[0],&stu.score[1], stu.addr);

c语言文件的读写格式

C程序文件的读写操作 在对文件进行读、写操作之前,首先要解决的问题是如何把程序中要读、写的文件与磁盘上实际的数据文件联系起来。在c语言中,其实这并不困难,只需要用c语言提供的库函数fopen“打开”文件就可以实现这些联系。Fopen函数的一般调用形式为: Fopen(文件名,文件使用方式); 函数返回一个指向file类型的指针。例如: FILE *fp; /*****定义一个文件指针*/ fp=fopen(”file_a”,”r”); foen函数调用中用两个字符串作为参数。第一个字符串中包含了进行读、写操作的文件名,用来指定所要打开的文件。在本例中,指定的函数名:file_a。第二个字符串中指定了文件的使用方式,用户可通过这个参数来指定对文件的使用意图。 如果以上函数调用成功,函数返回一个fille类型的指针,付给指针变量fp,从而把指针fp与文件file_a联系起来,也就是说,在此调用之后,指针fp就指向了文件file_a。 C语言中,最常用的文件使用用方式及其含义如下: (1)“r”。为读而打开文本文件。当指定这种形式时,对打开的文件只能进行“读”操作。若制定的文件不存在,则会出错,若去读一个不允许读的文件时也会出错。 (2)“rb”。为读而打开一个二进制文件,其余如“r”功能。 (3)“w”。为写而打开文本文件。这是。如果指定的文件不存在,系统将在指定位置建立一个新文件;如果文件已经存在,则将从文件的起始位置开始写,文件中原有内容将全部覆盖。 (4)“WB”. 为读而打开一个二进制文件,其余如“w”功能。 (5)“a”。为在文件后面添加数据而打开文本文件。这是。如果指定的文件不存在,系统将在指定位置建立一个新文件;如果文件已经存在,则将从文件的末尾位置开始写,文件中原有内容将保留。 (6)“ab”。为读而打开一个二进制文件,其余如“a”功能。 (7)“r+”。为读和写而打开文本文件。用这种方式时,指定的文件应当已经存在,既可以对文件进行读,也可以进行写。读写都是从文件起始位置开始。 关闭文件: fclose(文件指针); 程序例子: #include #include //fputc和fgetc函数所在文件 main() { FILE *fp=NULL; //定义文件指针 char ch; //定义字符变量 fp=fopen("d:\\wenjian.txt","w"); //打开或新建打开文件,并使指针 //指向文件 if(fp==NULL)

C#中的文件读写操作详解

C#中的文件读写操作详解(摘自互动维客:https://www.sodocs.net/doc/fb14923238.html,,更多内容 请访问互动维客!) C#中的文件操作详解 微软的.Net框架为我们提供了基于流的I/O操作方式,这样就大大简化了开发者的工作。因为我们可以对一系列的通用对象进行操作,而不必关心该I/O操作是和本机的文件有关还是和网络中的数据有关。.Net框架主要为我们提供了一个System.IO命名空间,该命名空间基本包含了所有和I/O操作相关的类。 本文将向大家介绍一些基本的文件操作方法,包括对文件系统中的目录和文件的操作,还有就是文件的读写操作等。通过运用System.IO.DirectoryInfo类和System.IO.FileInfo类我们可以轻易的完成与目录和文件相关的操作,而通过运用System.IO.StreamReader类和System.IO.StreamWriter类我们可以方便的完成与文件的读写相关的操作。 命名空间概览 下面的表格显示了System.IO命名空间中最重要的一些类,通过运用这些类我们就能完成基本的文件操作。 表1 类名功能和用途 BinaryReader、BinaryWriter 读写二进制数据 Directory、File、DirectoryInfo以及FileInfo 创建、删除并移动目录和文件,通过属性获取特定目录和文件的相关信息 FileStream 以随机方式访问文件 MemoryStream 访问存储在内存中的数据 StreamReader 、StreamWriter 读写文本数据信息 StringReader、StringWriter 运用字符串缓冲读写文本数据信息 运用DirectoryInfo类和FileInfo类 DirectoryInfo类和FileInfo类的基类都是FileSystemInfo类,这个类是一个抽象类,也就是说你不可以实例化该类,只能通过继承产生其子类并实例化其子类。然而你却可以运用由该类定义的各种属性,下面的表格显示了该类已经定义了的各种属性。 表2 属性功能和用途

matlab文件操作及读txt文件(fopen,fseek,fread,fclose

matlab文件操作及读txt文件(fopen,fseek,fread,fclose) matlab文件操作 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。 1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:λ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。λ λ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。λ λ‘a’:在打开的文件末端添加数据。文件不存在则创建。 λ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。

2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose 函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 >> a=[1 2 3 4 5 6 7 8 9]; >> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件 fid =3 %其值大于0,表示打开成功 >> fwrite(fid,a,'double') ans = 9 %表示写入了9个数据 >> fclose(fid)

Matlab的各种数据读取、文件读写等操作汇总

Matlab 的各种数据读取、文件读写等操作汇总 MATLAB 提供了多种方式从磁盘读入文件或将数据输入到工作空间,即读取数据,又叫导入数据;将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据。至于选择哪种机制,则根据下面两个因素决定:?用户所执行的 操作是导入数据还是导出数据;?数据的格式为文本格式、 二进制格式还是如HDF 之类的标准格式。将数据导入MATLAB 中最容易的方法就是使用导入数据模板(Import Wizard) ,使用该模板时不需要知道数据的格式,只需指定包含这些数据的文件,然后导入模板会自动处理文件内容。本章重点内容如下:? 文件的打开和关闭? 文本文件的读取?存写ASCII数据?二进制数据的读取? 二进制数据的存写? 使用I/O文件函数进行数据读写?MAT 文件的读写 2.1 文件的打开和关闭2.1.1 文件的打开无论是要读写ASCII 码文件还是二进制文件,都必须先用fopen 函数将其打开,在默认情况下,fopen 以二进制格式打开文件,它的使用语法如下:fopen ('filename', 'mode') 其中filename 表示要读写的文件名称,mode 则表示要对文件进行的处理方式,如下:rt :以只读方式(Reading)打开文件wt:以只写方式(Writing)打开文件at:以追加方式(Appending)打开文件,新内容将从原文件后面续写r+t:以同时读写方式打开文件w+t :以同时读写创建文件,原文件内容被清除

a+t :以同时读和追加(Reading and Appdending) 方式,原文件内容被保留,新内容将从原文件的后面开始At :以读写方式打开或创建文件,适用于对磁带介质文件的操作Wt :以写入方式打 开或创建文件,原文件内容被清除,适用于磁带介质文件的操作fopen 函数有两个返回值,一个是返回一个文件标志(file Identifier) ,它会作为参数被传入其他对文件进行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。如果返回的文件标识是-1,则代表fopen无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限。另一个返回值就是message ,用于返回无法打开文件的原因。为了安全起见,最好在每次使用fopen 函数时,都测试其返回值是否为有效值。下面以脚本m 文件为例来声明文件的打开。例 2-1 %exam1.m[f,message]=fopen('fileexam1', 'r')if f==-1disp (message); % 显示错误信息end 若文件fileexam1 不存在,则显示如下信息。Cannot open file.existence?permissions?memory?... 例2-2 %exam2.m[f,message]=fopen('fileexam2', 'r');if f==-1disp (message); % 显示错误信息else disp(f);end 若文件fileexam2 存在,则返回f值。 2.1.2 文件的关闭一旦完成文件的读写,最好关闭文件,以便对其进行其他操作。这时就可以使用fclose 函数来关闭文件,其适用语法如下:fclose(f) 。其中 f 为打开文件的标志,若fclose 函数返回值为0 ,则表示成功关闭 f 标志的文件;若返回值为-1,

C语言中文件_数据的输入输出_读写

C语言中文件,数据的输入输出,读写. 文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。 所谓文件是指内存以外的媒体上以某种形式组织的一组相关数据的有序集合。文件分类: 顺序文件,随机文件。 文本文件和二进制文件。 文本文件也称为ASCII文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。 文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。 二进制文件是按二进制编码方式来存放的。这里主要讨论文件的打开,关闭,读,写,定位等操作。 文件的存取方法 C程序的输入输出(I/O)有两种方式:一种称为标准I/O或流式I/O,另一种称为低级I/O。流式I/O是依靠标准库函数中的输入输出函数实现的。低级I/O利用操作系统提供的接口函数(称为底层接口或系统调用)实现输入输出,低级I/O 主要提供系统软件使用。 在C语言中用一个FILE类型的指针变量指向一个文件,(FILE类型是系统在stdio.h中定义的描述已打开文件的一种结构类型),这个指针称为文件指针。FILE *指针变量标识符; 如 FILE *fp; 文件的打开与关闭 所谓打开文件,指的是建立文件的各种有关信息,并使文件指针指向该文件,以便对它进行操作。 关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。 1、fopen 函数原型:FILE *fopen(const char *filename,const char *mode); Fopen函数用来打开一个文件,前一部分用来说明文件路径及文件名,后一部分mode指出了打开文件的存取方式;返回值是被打开文件的FILE型指针,若打开失败,则返回NULL。打开文件的语法格式如下: 文件指针名=fopen(文件名,使用文件方式); 文件指针名必须被说明为FILE类型的指针变量。 FILE *fp; fp=fopen(“C:\\Windowss\\abc.txt”,”r”); 注意用两个反斜杠\\来表示目录间的间隔符。 存取文件的模式是一个字符串,可以由字母r,w,a,t,b及+组合而成,各字符的含

Java流(文件读写操作)

Java流 一、流的分类 ?按数据流动方向 –输入流:只能从中读取字节数据,而不能向其写出数据 –输出流:只能向其写入字节数据,而不能从中读取数据?按照流所处理的数据类型 –字节流:用于处理字节数据。 –字符流:用于处理Unicode字符数据。 ?按照流所处理的源 –节点流:从/向一个特定的IO设备读/写数据的流。(低级流)–处理流:对已存在的流进行连接和封装的流。(高级流)二、缓冲流 ?缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。 ?J2SDK提供了四种缓存流: –BufferedReader –BufferedWriter –BufferedInputStream s –BufferedOutputStream

?缓冲输入流支持其父类的mark()和reset()方法: –mark()用于“标记”当前位置,就像加入了一个书签,可以使用reset()方法返回这个标记重新读取数据。?BufferedReader提供了readLine()方法用于读取一行字符串(以\r 或\n分隔)。 ?BufferedWriter提供了newLine()用于写入一个行分隔符。 ?对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()方法将会使内存中的数据立刻写出。 三、类层次 3.1、InputStream类层次

3.2、OutputStream类层次 3.3、Reader类层次

3.4、Writer类层次 四、常用的字符流与字节流的转化 说明: 1.字节流用于读写诸如图像数据之类的原始字节流。 2.字符流用于读写诸如文件数据之类的字符流。 3.低级流能和外设交流。 4.高级流能提高效率。 5.InputStreamReader 是字节流通向字符流的桥梁。 6.OutputStreamWriter 是字符流通向字节流的桥梁。

C语言文件读写函数集合

C语言文件读写函数 1.fopen() fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen 实现三个功能:为使用而打开一个流,把一个文件和此流相连接,给此流返回一个FILR指针。 参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下: 字符串含义 "r" 以只读方式打开文件 "w" 以只写方式打开文件 "a" 以追加方式打开文件 "r+" 以读/写方式打开文件,如无文件出错 "w+" 以读/写方式打开文件,如无文件生成新文件 一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符’/n’,而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。

系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而 _fmode=O_BINARY;则设置默认打开方式是二进制模式。 我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。 此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL. 例: 以下是引用片段: FILE *fp; if(fp=fopen("123.456","wb")) puts("打开文件成功"); else puts("打开文件成败"); 2.fclose() fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。 在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的错误。 例:fclose(fp); 3.fputc()

项目四 Word 2003文档的格式设置

项目四 Word 2003文档的格式设置 ●任务一文档的基本格式设置 ●任务二使用模板 ●任务三页面、页眉与页脚、样式、目录 任务一文档的基本格式设置 在文档中输入文本后,用户可以根据需要对文本或段落设置格式,如设置文本的字符格式,为段落设置首字下沉,为文本或段落添加边框和底纹,为段落添加项目符号和编号,用制表位设置段落的对齐,以及为文档添加水印等。 本任务内容提要 一、设置字符和段落格式 二、设置文字下沉 三、设置边框和底纹 四、设置项目符号和编号 五、设置制表位与添加水印 六、插入艺术字 七、应用系统内置样式 一、设置字符和段落格式 字符格式包括字体、字号、字形和字符颜色等。段落是以回车符“ ”为结束标记的内 容,段落的格式设置主要包括段落的对齐方式、段落缩进、段落间距以及行间距等。 Word 2003默认的中文字符格式为宋体、五号字,英文字体为Times New Roman。 在实际工作中,我们可以根据需要利用“格式”工具栏,以及“字体”和“段落”对话框灵活设置文档的字符和段落格式。 选中文本后单击“格式”工具栏上的相应按钮即可 利用“格式”工具栏设置字体、字号和字体颜色时,可单击相应选项右侧的下三角按钮,然后从弹出的下拉列表中进行选择。字号的表示方法有两种:一种以“号”为单位,如初号、一号、二号……,数值越大,字号就越小;另一种以“磅”为单位,如10、10.5、15……数值越大,字号也越大。 利用“格式”工具栏设置段落的对齐方式时,只需单击相应的对齐方式按钮即可。这几个按钮的

作用从左到右分别是两端对齐、居中对齐、右对齐和分散对齐。 在该选项卡可设置文字效果 在此可设置字符效果

MFC-txt文件读写

文本文件的读写 正确的文本文件读写过程 1.定义文件变量; 2.打开指定的文件; 3.向从文本文件中写入信息; 4.从文本文件中读取信息; 5.关闭文件 1、定义文件变量 定义文件变量格式:CStdioFile 文件变量; 例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1; 2、打开指定文件 可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等): CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags); 其中,lpszFileName表示要打开的文件名,可以是相对路径或绝对路径 nOpenFlags设置文件打开方式标志位,可以指定用“|”连接多个标志位。下面是常用的打开标志: CFile::typeText:以文本文件的形式打开文件 CFile::typeBinary:以二进制文件的形式打开文件 CFile::modeCreate:如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。 CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。

:以只读方式打开文件 CFile::modeReadWrite:以可读可写方式打开文件 CFile::modeWrite:以只写方式打开文件 CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作CFile::shareExclusive:文件打开后,禁止其他进程对文件的读写操作CFile::shareDenyRead:文件打开后,禁止其他进程对文件的读操作

C语言文件操作命令

C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。 返回值 fclose(关闭文件) 相关函数 close,fflush,fopen,setbuf 表头文件 #include 定义函数 int fclose(FILE * stream); 函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。 返回值若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。 错误代码 EBADF表示参数stream非已打开的文件。 范例请参考fopen()。 fdopen(将文件描述词转为文件指针) 相关函数 fopen,open,fclose 表头文件 #include 定义函数 FILE * fdopen(int fildes,const char * mode); 函数说明 fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。 返回值转换成功时返回指向该流的文件指针。失败则返回NULL,并把错误代码存在errno中。 范例 #include main() { FILE * fp =fdopen(0,”w+”); fprintf(fp,”%s\n”,”hello!”); fclose(fp); } 执行 hello! feof(检查文件流是否读到了文件尾) 相关函数 fopen,fgetc,fgets,fread 表头文件 #include 定义函数 int feof(FILE * stream); 函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返

C语言文件操作之文件的读写[1]

C语言文件操作之----文件的读写 当文件按指定的工作方式打开以后,就可以执行对文件的读和写。下面按文件的性质分类进行操作。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。 1. 读写字符 C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为: int fgetc(FILE *stream) fgetc( )函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。 int fputc(int ch,FILE *stream) fputc()函数完成将字符c h的值写入所指定的流文件的当前位置处,并将文件指针后移一位。fputc()函数的返回值是所写入字符的值,出错时返回EOF。 [例8-2] 将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。采用带参数的main( ),指定的磁盘文件名由命令行方式通过键盘给定。 #i nclude main(argc,argv)

int argc; char *argv[]; { char ch; FILE *fp; int i; if((fp=fopen(argv[1],"r"))==NULL) /* 打开一个由argv[1]所指的文件*/ { printf("not open"); exit(0); } while ((ch=fgetc(fp))!=EOF) /* 从文件读一字符,显示到屏幕*/ putchar(ch); fclose(fp); } 程序是一带参数的main( )函数,要求以命令行方式运行,其参数argc是用于记录输入参数的个数,argv是指针数组,用于存放输入参数的字符串,串的个数由argc描述。假设我们指定读取的文件名为L8-2.c,并且列表文件内容就是源程序。经过编译和连接生成可执行的文件L8-2.exe。运行程序l8-2.exe,输入的命令行方式为:c:\tc>l8-2 L8-2.c

(完整版)fortran文件操作

fortran文件操作 From: 《Fortran 95 程序设计》彭国伦 1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file 指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901 open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。 STATUS='NEW' 打开一个原本不存在的新文件 STATUS='OLD' 打开一个原来已经存在的文件 STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。 STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。 STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。 !这一栏不给定时,默认为STATUS='UNKNOWN'。 ACCESS='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法:

C语言文件操作之绝对路径

C语言中对文件进行操作如何使用绝对路径? 我编了一个小程序试了一下,好像默认的路径是在生成的.exe文件所在目录下。如果使用像D:\\ABC.TXT这样的路径可以在D盘下对ABC.TXT进行操作,但如果使用D:\\SSS\ABC.TXT就不正确了,创建的文件是SSSABC.TXT,不支持多级的路径,它把路径和文件名弄混了。 到底怎么办 D:\\SSS\\ABC.TXT //你少了个\,在C字符串中,出现\的地方,你一律打两个\\就行了。 请问啊,C语言里,fopen、fread与fwrite的参数中,要求文件名,用写盘符吗? 写绝对路径吗?#include #include int main() { FILE *pfile = fopen("d:\\Jimmy.txt","wb");//Jimmy.txt写在D盘根目录下绝对路径//以2进制写入方式打开 //FILE *pfile = fopen("\\Jimmy.txt","wb");//Jimmy.txt写在当前目录下相对路径//以2进制写入方式打开 char sz[6] = "Billy"; fwrite("Jimmy",6,1,pfile);//将字串"Jimmy"写入文件pfile fclose(pfile); pfile = fopen("d:\\Jimmy.txt","rb");//以2进制读取方式打开绝对路径,D盘根目录 //pfile = fopen("\\Jimmy.txt","rb");//以2进制读取方式打开相对路径,当前路径 printf(sz);//显示原字串 printf("\n"); fread((char*)sz,6,1,pfile);//由开头读入6字节信息 printf(sz);//显示读取的信息 printf("\n"); fclose(pfile); system("pause"); return 0; }

Java 对文件读写操作

Java 对文件进行读写操作的例子很多,让初学者感到十分困惑,我觉得有必要将各种方法进行 一次分析,归类,理清不同方法之间的异同点。 一.在JDK 1.0 中,通常是用InputStream & OutputStream 这两个基类来进行读写操作的。InputStream 中的FileInputStream 类似一个文件句柄,通过它来对文件进行操作,类似的,在 OutputStream 中我们有FileOutputStream 这个对象。 用FileInputStream 来读取数据的常用方法是: FileInputStream fstream = new FileInputStream(args[0]); DataInputStream in = new DataInputStream(fstream); 用in.readLine() 来得到数据,然后用in.close() 关闭输入流。 完整代码见Example 1。 用FileOutputStream 来写入数据的常用方法是: FileOutputStream out out = new FileOutputStream("myfile.txt"); PrintStream p = new PrintStream( out ); 用p.println() 来写入数据,然后用p.close() 关闭输入。 完整代码见Example 2。 二.在JDK 1.1中,支持两个新的对象Reader & Writer,它们只能用来对文本文件进行操作,而 JDK1.1中的InputStream & OutputStream 可以对文本文件或二进制文件进行操作。 用FileReader 来读取文件的常用方法是: FileReader fr = new FileReader("mydata.txt"); BufferedReader br = new BufferedReader(fr); 用br.readLing() 来读出数据,然后用br.close() 关闭缓存,用fr.close() 关闭文件。 完整代码见Example 3。 用FileWriter 来写入文件的常用方法是: FileWriter fw = new FileWriter("mydata.txt"); PrintWriter out = new PrintWriter(fw); 在用out.print 或out.println 来往文件中写入数据,out.print 和out.println的唯一区别是后者写 入数据或会自动开一新行。写完后要记得用out.close() 关闭输出,用fw.close() 关闭文件。完整代码见Example 4。 -------------------------------------------------------------- following is the source code of examples------------------------------------------------------ Example 1:

C语言文件读写

C语言文件读写(基于缓冲技术) Syd168 2011.10.1 当文件按指定的工作方式打开以后,就可以执行对文件的读和写。下面按文件的性质分类进行操作。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。 0. 文件打开与关闭 1. 读写字符 C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于stdio.h头文件中,格式为: ?int fgetc(FILE *stream) fgetc( )函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。 ?int fputc(int ch,FILE *stream) fputc()函数完成将字符c h的值写入所指定的流文件的当前位置处,并将文件指针后移一位。 fputc()函数的返回值是所写入字符的值,出错时返回EOF。 [例] 将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。 采用带参数的main( ),指定的磁盘文件名由命令行方式通过键盘给定。

参数argc是用于记录输入参数的个数,argv是指针数组,用于存放输入参数的字符串,串的个数由argc描述。假设我们指定读取的文件名为L8-2.c,并且列表文件内容就是源程序。经过编译和连接生成可执行的文件L8-2.exe。运行程序l8-2.exe,输入的命令行方式为: c:\tc>l8-2 L8-2.c 上述程序以命令行方式运行,其输入参数字符串有两个,即argv[0]="c:\tc>l8-2"、argv[1]=" L8-2.c ",argc = 2。故打开的文件是L8-2.c 。程序中对fgetc( )函数的返回值不断进行测试,若读到文件尾部或读文件出错,都将返回C的整型常量EOF,其值为非零有效整数。程序的运行输出为源程序本身:c:\tc>l8-2 L8-2.c

word格式化文档技巧

第2章格式化文档技巧 不论是用笔还是用电脑撰写文章,最重要的肯定是要言之有物。但除了内容之外,形式也是很重要的。尤其是使用文字处理软件撰写文章、专著,如果懂得如何快速、巧妙地设置格式,不仅可以使文稿样式美观,更可以加快编写速度。而如果不懂得这些基本的格式化手段,编辑起文稿来,就会感到处处受到束缚,写作过程也难以顺畅,影响工作效率。 2.1 格式化字符技巧 字符可以是一个汉字,也可以是一个字母、一个数字或一个单独的符号,字符的格式包括字符的字体、大小、粗细、字符间距及各种表现形式。 简单的字符格式可以通过工具栏上的按钮来进行排版操作,如,设置字体加粗,可以单击工具栏上的按钮来实现、设置字体字号,可以单击工具栏上的【字号】下拉列表按钮来选择字号等;也可以通过快捷键来完成,如,选择字体下划线,可以单击【下划线】按钮或在下拉列表中选择下划线的线型。 但是,一些特殊的字体必须通过【字体】对话框才能完成设置。如果要制作出更具有艺术性的字符效果,如,变形字体、旋转字等,可以通过艺术字来完成。使用【格式】工具栏格式化字符可以设置一些简单的字符格式。 2.1.1 随意地选择字号 选择字号方法很简单,单击常用工具栏上的下拉列表按钮,在字号列表中选择或输入字号。 字号的表示方法有两种,一种是中文数字,数字越小,对应的字号越大;另一种是阿拉伯数字,字号越小,字符也就越小。字号的单位为磅,用毫米换算的方法为:1毫米=2.83磅;磅与号的换算单位是:1磅=1/72英寸,1英寸=21.4毫米。 在Word中,表述字体大小的计量单位有两种,一种是汉字的字号,如初号、小初、一号、…七号、八号;另一种是用国际上通用的“磅”来表示,如4、4.5、10、12、… 48、72等。 中文字号中,“数值”越大,字就越小,所以八号字是最小的;在用“磅”表示的字号时,数值越小,字符的尺寸越小,数值越大,字符的尺寸越大。1磅有多大呢?2.83磅等于1毫米,所以28号字大概就是一厘米高的字,约相当于中文字号中的一号字。

相关主题