第9章C#的文件
c程序设计 第九章 结构体
一、概念题二、判断题1. 结构体中的成员不可以单独使用(F)。
2. 成员名可以与程序中的变量名相同,二者不代表同一对象(T)。
3. 不能将一个结构体变量作为一个整体进行输入输出(T)。
4. 结构体变量所占内存长度是各成员占的内存长度之和(T)。
5. 结构体中的成员不可以单独使用(F )。
9. 一个结构体变量的指针就是该变量所占内存段的起始地址(T)。
10. 用结构体变量作实参,形参也必须是同类型的结构体变量(T )。
三、单选题1. 设变量定义如下,则对其中的结构分量num正确的引用是( )。
struct student {int num ;char name[20];float score;} stud[10];A. stud[1].num=10;B. student.stud.num=10;C. struct.stud.num=10;D. struct student.num=10;2. 已知职工记录描述如下,设变量w中的“生日”是“1993年10月25日”,下列对“生日”的正确赋值方式是()。
struct worker{int no;char name[20];char sex;struct birth{ int day; int month; int year;}a;};struct worker w;A day=25;month=10;year=1993;B w.birth.day=25; w.birth.month=10; w.birth.year=1993;C w.day=25; w.month=10; w.year=1993;D w.a.day=25; w.a.month=10; w.a.year=1993;3. 对于以下的变量定义,语句( )在语法和语义上都是正确的。
struct node {float x,y;char s[10];} point={1,2,”abc”},*p;A. *p=point;B. p=&point;C. point=p;D. p->x=point.y;4. 设有以下语句typedef struct S{ int g;char h;} T;则下面叙述中正确的是()。
C语言数据结构-第9章 结构体共用体与枚举
"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];
C语言程序设计 第9章 文件
9.3 文件的顺序读写
❖ 【例9.4】fputs函数和fgets函数的使用。
9.3 文件的顺序读写
❖ 9.3.3 fprintf函数和fscanf函数 ❖ fprintf与fscanf函数为格式读写函数,与printf、scanf类似,fprintf与
fscanf用于从文件中读取指定格式的数据和把指定格式的数据写入文件,这 是按数据格式要求进行文件的输入/输出。其一般形式为: ❖ fscanf(fp,format,args); ❖ fprintf(fp,format,args); ❖ 其中,fp为文件指针,format为格式控制字符串,args为输入或输出的地 址列表。 ❖ 例如,若文件指针fp已指向一个已打开的文件文本,a、b分别为整型变量 ,则以下语句从fp所指向的文件中读入两个整数放入变量a和b中。 ❖ fscanf(fp,”%d%d”,&a,&b); ❖ 又如,若文件指针fp已指向一个已打开的文件文本,x、y分别为整型变量 ,则以下语句将x、y中的数据按%d的格式输出到fp所指向的文件中。 ❖ fprintf(fp,"%d%d",&a,&b);
本章小结
❖ 本章主要介绍了以下内容。 ❖ (1)文件的概念 ❖ 介绍了文件及文件指针的基本概念,以及文件的打开与关闭
函数fopen、fclose等。 ❖ (2)文件的顺序读写 ❖ 主要介绍了从文件中输出字符、字符串,以及将字符、字符
串写入文件的函数。 ❖ (3)随机文件的读写及错误检测 ❖ 主要介绍了随机文件读写的应用,以及文件的出错检测。
❖ 在实际读写文件中,人们常常希望能直接读到某一数据 项而不是按物理位置顺序逐个读下来。这种可以任意指 定读写位置的操作称为文件的随机读写。可以想象,只 要能移动位置指针到所需要的地方,实现文件的定位, 就能实现随机读写。
第9章 指针
第9章指针指针是C语言的精华,指针让C语言威力无穷,魅力四射。
为什么scanf函数的实参有时要加一个&操作符,有时却不加?为什么数组作为参数时就可以改变实参的值?这些前面遗留的问题都与指针有关,这些问题的答案均可在本章中找到。
指针是C语言中特殊的数据类型。
整型变量所标识的存储单元中存放整数,浮点型变量中存放浮点数,那么指针变量所标识的存储单元中存放的显然是指针,但是指针是什么呢?9.1 指针类型9.1.1 变量的左值和右值变量用于标识存储单元。
计算机中的内存以字节为单位编号。
编号多为32位的二进制数,从0号开始,即0x0000 0000、0x0000 0001、……、0xffff ffff。
计算机中只用内存编号(又称内存地址)标识内存单元。
如果定义并初始化了一个整型变量如int i = 5;,则计算机中的内存状态可能如图9-1所示。
图9-1 变量i的内存状态图从图9-1可知,整型变量i所标识的存储单元共4个字节,通常以存储单元的首字节地址作为该存储单元的地址,即整型变量i所标识的存储单元的地址为0x0012 ff00,类型为整型。
当取变量i的值时,计算机会把从0x0012 ff00处开始的4个字节作为一个整体,取出其中的内容,然后按整型解码最终得到变量i的值为5。
存储单元如宿舍,其地址像宿舍号(如408),其存储的内容如住宿者(如王五),相关变量名如宿舍的雅称(如liaozhai)。
由以上分析可知,变量既标识存储单元的地址又标识其存储的内容,因此变量比如整型变量i也有两个值。
整型变量i的一个值是地址0x0012 ff00,另一个值是内容5。
变量i在使用时表现为何值呢?例9-1分析语句i = 5; j = i;中整型变量i的值。
分析:语句i = 5;的操作结果是把5放入变量i所标识的存储单元中,也就是把5的补码存入地址为0x0012 ff00的存储单元中,变量i的值此时实为地址0x0012 ff00。
C语言第9章结构体、共用体、枚举
结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
第9章 指针
第九章指针指针是C语言的一个重要概念,也是C的一个重要特色。
正因为有了指针,C语言才可以灵活有效的表示复杂的数据结构,更方便地处理诸如内存、字符串、数组、函数等。
可以说,不掌握指针就不能掌握C的精华。
一、地址和指针的概念地址的概述1、存储器地址计算机所处理的数据,总是要存储在一定的存储介质上,例如内存。
而这些数据的存储,又是有一定先后顺序的。
因此我们通常将这些存储介质上的一个个用于存放数据的基本单元进行线性编址,即按照一定的顺序给每个存储单元(字节)一个编号,这个编号就是该单元的地址。
一般情况下,地址总是从0开始的一系列整数。
某个地址就代表某个存储单元,就如一个房间号Array码对应于一个实际的房间一样。
2、存储单元的内容这是不同于地址的另一概念,它是指某地址单元内具体存放的数据,如一个字符、一个整数、实数或一个字符串。
例:如右图100,101,102,…,205,206等即是地址;160单元的内容就是字符C,161单元的内容就是字符H,…,等。
3、变量的访问一般情况下,程序中的一个变量就对应存储器的若干个单元,对变量的访问可以简单地认为是通过变量名来对内存单元进行存取操作。
实际上,程序在编译之后,变量名已经转化为了与该变量对应的存储单元地址,因而对变量的访问就是通过地址对存储单元的访问。
1)直接访问按照变量地址来对变量进行存取的方式,称为直接访问方式。
例如:右表中对变量a的读取:printf(“%d”,a),其实是先找到a的地址160,然后从160开始读取一个字节的字符‘C’;同理用scanf(“%d”,&b)输入b的值时,在执行时,直接把从键盘输入的数据‘H’送入从地址为161开始的字节单元中。
2)间接访问通过另一变量间接获取某变量的地址,从而间接实现对原变量的访问的方式,称为间接访问方式。
例如:将变量a的地址160存放在另一个变量当中,见上表p=160,那么,对变量a的访问也可以为:先通过变量p的地址205找到该单元的数据160,再将160视为地址,该地址单元内容就是变量a的值(字符‘C’)。
C语言程序设计 第3版 第9章 编译预处理
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
C语言第九章 数组总结
基本概念:数组 :一组具有相同名字、不同下标、个数固定的同类型变量的集合数组元素 :数组中的一个变量数组的类型 :数组元素的类型(基本类型包括:整型(int )浮点型(float )双精度浮点型(double )字符型(char )无值型(void ))数组的维数 :确定数组中各元素之间相对位置的下标个数(1.下标必须是正数常数或整形表达式 2.下标的取值从0开始,最大下标值为数组元素个数减一 3.下标不要越界)例如:int a[6];int 是类型,a[6]是一维数组说明符 为a 开辟a[0] a[1]a[2]a[3]a[4]a[5] 六个连续的存储单元。
一维数组的初始化:1.数组不初始化,其元素值为随机值 2.所赋初值少于定义个数系统为后面元素自动补零 3.当全部数组元素赋初值时,可不指定数组长度例如:int a[5]={1,2,3,4,5} 等价于a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;应用:例如:定义一个数组,使a[0]到a[7]的值为0~7,然后输出。
#include <stdio.h>main(){int i,a[8]; /*一维数组的定义*/for(i=0;i<=7;i++)a[i]=i; /*一维数组的初始化*/for(i=0;i<=7;i++)printf("%d ",a[i]); /*一维数组的引用*/}例如:读十个正数存入数组,找到其中最大值和最小值。
思路:1.用for 循环出入10个正数 2.处理:(a)先令max=x[0] (b)依次用x[i]和max 比较(循环)若max<x[i],令max=x[i] 3.输出:max#include <stdio.h>#define SIZE 10main(){ int x[SIZE],i,max;printf("Enter 10 integers:\n");for(i=0;i<SIZE;i++) scanf("%d",&x[i]);max=x[0];for(i=1;i<SIZE;i++)if(max<x[i])max=x[i];}二维数组的定义方式:数据类型 数组名[常量表达式][常量表达式] (按行序先)例如:int a[3][4]用for 出入10个正数(有一个m*n 的二维数组a ,其中i 行j 列元素a[i][j]在数组中的位置计算公式是:i*n+j+1)可把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组例如:把 a[3][4] 看作是一个一维数组,有3个组元素:a[0]、a[1]、a[2],每个组元素中又包含 4 个元素的一维数组。
c语言第9章_指针及其应用(1)课后复习重点[1]教程
指针变量在使用前
必须赋值!
swap(pointer_1,pointer_2);
printf("a=%d,b=%d\n", *pointer_1,*pointer_2); return 0; } 2018/11/2
运行结果:
a:10 *pa:10
...
printf("&pa:%x(hex)\n",&pa);
return 0; }
&a:f86(hex)
pa:f86(hex) &pa:f8a(hex)
16
2018/11/2
例:输入两个数,并使其从大到小输出
int main()
{
int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b);
24
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; int x,*p=&x; *p=*p1; *p1=*p2; *p2=*p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
2018/11/2
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2018/11/2
C语言第9章人民邮电出版社张小东.ppt
久
性 存
文件概念:文件是指存储在永久性存储设备上的
储 具有名字(文件名)的一组相关数据的集合,通常也
被称为磁盘文件。
C
语 言
§9.2 文件的组织方式
程
序
设
根据编码方式,文件可以分为两种:一种是文本
计
文件(ASCII码文件),另一种是二进制文件。
文本(ASCII码)文件形式 (6字节)
第
九 章
内存中存放形式 00000000,00000011,
的
ferror() 文件访问错误测试
fwrite() 向文件流中写入指定大小的数据块
永
fgetc() 从文件流中读取(输入)一个字符
久
性
fputc() 写入(输出)一个字符到文件流中
rewind() fseek()
文件内部读写位置指针复位到文件头 文件内部读写位置指针置为特定位置
存
fgets() 从文件流中读一行或指定长度字符串
字符转换
00110010 00110000 ‘2’ (50) ‘0’ (48)
00110000 00111000 00110000 00111000 ‘0’ (48) ‘8’ (56) ‘0’ (48) ‘8’ (56)
数 据
00010000,01101000
整数 200808 (4字节)
直接存放
00000000,00000011,00010000,01101000
程 序
§9.3.1 stdio.h
设
计
stdio.h中关于文件的常用函数
第
函数名 功能说明
九
章
fopen() 打开文件流
函数名 fscanf()
C语言 选择题库第9章 编译预处理和动态存储分配
第9章编译预处理和动态存储分配1.以下叙述中正确的是()。
A) 在C语言中,预处理命令行都以"#"开头B) 预处理命令行必须位于C源程序的起始位置C) #include <stdio.h>必须放在C程序的开头D) C语言的预处理不能实现宏定义和条件编译的功能参考答案:A【解析】预处理命令是以"#"号开头的命令,它们不是C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以B),C)错误。
C)语言的预处理能够实现宏定义和条件编译等功能,所以D)错误。
2.以下关于宏的叙述中正确的是()。
A) 宏替换没有数据类型限制B) 宏定义必须位于源程序中所有语句之前C) 宏名必须用大写字母表示D) 宏调用比函数调用耗费时间参考答案:A【解析】宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以B)选项中宏定义必须位于源程序中所有语句之前是错误的。
宏名一般用大写,但不是必须用大写,所以C)选项错误。
宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值),所以D)选项错误。
3.有以下程序:#include <stdio.h>#define PT 3.5 ;#define S(x) PT*x*x ;main(){int a=1,b=2;printf("%4.1f\n" ,S(a+b));}程序运行后的输出结果是()。
A) 7.5 B) 31.5 C) 程序有错无输出结果D) 14.0参考答案:C【解析】宏定义不是C语句,末尾不需要有分号。
所以语句printf("%4.1f\n" ,S(a+b));展开后为printf("%4.1f\n" ,3.5;*a+b*a+b;);所以程序会出现语法错误。
有机化学C第9章 卤代烃问题参考答案
19 卤代烃问题参考答案问题1 预测正戊基碘与正己基氯哪一个沸点较高? 讨论:一元卤烷的沸点随碳原子数的增加而升高;同一烃基的卤烷沸点:碘烷 > 溴烷 > 氯烷。
综合考虑前者沸点较高。
问题2 怎样制备甲基叔丁基醚?讨论: 采用威廉森合成法制备混醚时一般选用伯卤代烃为原料。
因为在碱性条件下,仲、叔卤代烃容易发生消除反应。
本例采用氯甲烷和叔丁醇钠为原料。
问题3 试解释 (S)-3-甲基-3-溴己烷在水-丙酮中反应, 结果旋光性消失的实验事实。
讨论: 在S N 1反应中,当亲核取代反应发生在手性碳原子上时,因为在反应的慢步骤中生成的碳正离子是平面构型的,亲核试剂将机会均等地从平面两侧进攻碳正离子,如果离去基团所在的中心碳原子是一个手性碳原子,亲核试剂的进攻又完全随机的活,则生成的两种对映体应是等量的,产物为外消旋体。
问题4 试解释(S)-2-溴辛烷与氢氧化钠的乙醇水溶液反应得到(R)-2-辛醇的实验事实。
讨论:S N 2历程中会发生瓦尔登(Walden)转化,如果取代反应发生在旋光性卤代烷的手性碳原子上,则生成的醇构型与反应物卤代烷的构型正好相反。
问题5 怎样使羟基转变成一个好的离去基团?讨论:无论是S N 1还是S N 2反应,离去基团的碱性越弱,越易离去。
碱性很强的基团(如 R 3C -、R 2N -、RO -、HO -等)不能作为离去基团进行亲核取代反应,如R-OH 、ROR 等,就不能直接进行亲核取代反应,HO -是碱性很强的基团,只有在H + 性条件下形成RO +H 2和RO +R 后才能离去。
例:CH 3CH 2CH 2CH 2OH + NaBrCH 3CH 2CH 2CH 2Br + OH CH 3CH 2CH 2CH 2OH + HBrCH 3CH 22CH 2OH + Br S N 2BrCH 3CH 22CH 2Br + H 2O2Br 3H 13C 6H NaOH O H CH 3C 6H 13H NaBr C +C +[α]=-34.6°[α]=+9.9° S RCH 3ONa CH 3C H 3CH 3Cl CH 3OMe CH 3C H 3C +C R2问题6 请比较苄基溴、α-苯基乙基溴、β-苯基乙基溴进行S N 1反应时的速率大小。
第9章 钯催化C-C键交叉偶联反应的机理
Negishi couplings
1 反式(trans)过渡态比顺式(cis)的更容易生成 2 两者是相互竞争的反应 3 只有顺式过渡态可以转化为最终产物 4 顺反式不会直接相互转换
Sonogashira couplings
1 Cu(I)可以活化炔烃生成炔基铜
2 根据脱质子和配体交换的顺序,可以将机理分为阳离子 型机理和阴离子型机理。 3 离子型机理与前两种机理存在竞争关系,可以有效提高 反应速率。 4 离子型机理中碱有两个作用:结合质子和卤素(吸电基 有利于反应进行)
有机反应机理
3 过渡态能垒大小:vinyl < Ph < ethynyl < Me, 马来酰胺 < “empty” < ethylene < PMe3 ≈ MeCN
4 能垒大小与π电子接受能力成反比,因此π电子接受能力差的配体(PMe3)会在还原消除过程前解 离。
3. 结论
计算化学 Computational Chemistry 实验化学 Experimental Chemistry
C-H活化芳基化反应
1 转移金属化过程是反应的决速步 2 钯不与氢原子直接作用,碱与质子结合后形成卡宾可以 与钯结合形成稳定的环状过渡态 3 Concerted metalation deprotonation (CMD)机理
2.3 还原消除
trans
cis
cis
1 只有顺式产物会进行还原消除 2 还原消除过理: 1 构型保持 2 气相反应 3 某些极性溶剂
SN2机理: 1 构型反转 2 液相反应
1 位阻小的磷配体,按SN2机理进行,在烷基位置反应。 2 位阻大的磷配体,按协同机理进行,在芳基位置反应。
Chem. Eur. J. 2010, 16, 13390-13397.
c语言 第9章_指针及其应用(1)课后复习重点[1]
指针变量必须先赋值,再使用
...
2000
10
整型变量i
2004
2008
变量k
10
指针变量p 随机 2004
2012
...
10
int i; float *p; p=&i;
一个指针变量不能指向 与其类型不同的变量!
应在类型相同的指 针变量之间赋值 int *p; float *q; p=q;
int *p; p=100;
23
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; p=p1; p1=p2; p2=p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
printf("a=%d,b=%d\n",a,b); printf("swapped:\n"); 调用结束 调用前 调用中
用于存放某个内存单元地址的变量。
(指向某内存单元的指针)
例如: char c = 'K'; char *p ;
p = &c;
p(4000) 2000 c(2000)
*p
75
2015/12/30
6
指针变量的声明
指针变量的声明格式: 数据类型 *变量名; – "*": 声明一个指针类型的变量; – "数据类型":指针变量所指向的变量的数据类型。
2015/12/30
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2015/12/30
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
打开文件,可以向文件中写 入数据 FileAccess.ReadWrite 打开文件,可读可写
参数share的取值及含义
取值 FileShare.None FileShare.Read 含义 谢绝共享当前文件。文件在关闭前, 打开该文件的任何请求都将失败 只读共享,允许随后打开文件读取
FileShare.ReadWrite 读写共享,允许随后打开文件读取或 写入 FileShare.Write 只写共享,允许随后打开文件写入
(5)Move方法
[格式]:public static void Move(string sourceFileName,string destFileName);
(6)Exists方法
[格式]:public static bool Exists(string path);
【例9-1】 编写一个对C盘根目录下的子目录和文件 进行操作的程序,程序的设计界面如图9-1所示, 程序的运行界面如图9-2所示。程序运行时将在 listBox1中显示C盘根目录下的所有子目录名称, 用户可以从中选择一个或多个子目录,选中后按【 删除】按钮将删除选中的子目录。用户也可以在文 本框中输入要创建的子目录名,输入后按【创建】 按钮将在C盘根目录下创建相应的子目录。程序运 行时在listBox2中显示C盘根目录下的所有文件名 ,用户选择一个或多个文件后按【删除】按钮将删 除选中的文件。
AutoFlush属性 BaseStream属性
(2)构造函数
[格式1]:public StreamWriter(Stream stream); [格式2]:public StreamWriter(string path);
ห้องสมุดไป่ตู้
(3)StreamWriter类的常用方法 Write方法
[格式1]:public override void Write( char value); [格式2]:public override void Write(char[] buffer); [格式3]:public override void Write( string value); [格式4]:public override void Write(char[] buffer,int index,int count);
Read 方法 [格式]:public override int Read(byte[] array, int offset, int count); ReadByte方法 [格式]:public override int ReadByte(); Write方法 [格式]:public override void Write(byte[] array,int offset, int count); WriteByte方法 [格式]:public override void WriteByte(byte value);
(1)CreateDirectory方法
[格式]:public static DirectoryInfo CreateDirectory(string path);
(2)Delete方法
[格式1]:public static void Delete(string path); [格式2]:public static void Delete(string path, bool recursive);
2、File类和FileInfo类
File类和FileInfo类都提供了创建、复制、删除、移动和打开文 件的方法,并协助创建FileStream对象。 (1)Create方法 [格式]:public static FileStream Create(string path); (2)Open方法 [格式1]:public static FileStream Open(string path,FileMode mode); [格式2]:public static FileStream Open(string path,FileMode mode,FileAccess access); [格式3]:public static FileStream Open(string path,FileMode mode,FileAccess access,FileShare share);
[格式]:public override int Read();
(3)ReadLine方法
[格式]:public override string ReadLine();
(4)Peek方法
[格式]:public override int Peek();
所有表示流的类都是从抽象基类Stream 继承的,Stream是抽象类。一般来说,对流 的操作有以下3类:
(1)读取:从流中读取数据到变量中 (2)写入:把变量中的数据写入到流中 (3)定位:重新设置流的当前位置,以便随即 读写。
文件
文件由特定顺序的字节组成,因此定义一种 好的文件格式能够极大的发挥应用程序的功能。 C#标准库提供了File和FileInfo类来操作文 件,Directory和DirectoryInfo类可以操作文件 夹(目录)。Path类包括了对文件或目录路径字 符串进行操作的方法。与读写文件对应的流称为 文件流(FileStream)。
第九章 文件 • 学习目标: 文件与流的基本概念 用Directory类进行目录管理 用File和FileStream类进行文件管理 用StreamReader类和StreamWriter类 进行文件的读写 文件的顺序读写和随机读写的方法
文件和流
•System.IO 命名空间包含了在数据流和文件上进行 读取及写入的类型。要使用这些类,通常需要在程 序的开头包含语句: using System.IO; 流和文件是既相关又有区别的两个概念。 流提供向后备存储写入和读取字节的方式,后 备存储包括磁盘、网络、内存和磁带等。 文件是在计算机中永久存储数据的唯一方式。 如果缺少流的支持,那么应用程序将无法保存 用户数据。
(6)GetFiles方法
[格式1]:public static string[] GetFiles(string path); [格式2]:public static string[] GetFiles(string path, string searchPattern);
(7)Move方法
[格式]:public static void Move(string sourceDirName,string destDirName);
(3)Exists方法
[格式]:public static bool Exists(string path);
(4)GetCurrentDirectory 方法
[格式]:public static string GetCurrentDirectory();
(5)GetDirectories 方法
[格式1]:public static string[ ] GetDirectories(string path); [格式2]:public static string[ ] GetDirectories(string path,string searchPattern);
1、Diectory类和DirectoryInfo类
Directory类和DirectoryInfo类都提供了复制、 移动、重命名、创建和删除目录的方法。 Directory类是静态类,而DirectoryInfo不是。 由于Directory类的所有方法都是静态的,所以如果只 想执行一个操作,那么使用Directory方法的效率更高 。如果打算多次重用某个目录对象,则应该使用 DirectoryInfo类的实例方法。
FileMode.Open
FileMode.OpenOrCreate
打开文件,通常用来读取数据,如果文件不存 在将引发异常
如果文件存在则打开文件,如果文件不存在, 则创建新文件
FileMode.Truncate
打开一个已经存在的文件,并且从头开始覆盖 其数据
参数access的取值及含义
取值 FileAccess.Read FileAccess.Write 含义 打开文件,可以从文件中读 取数据
【例9-2】 编写一个保存和显示文件的程序 ,程序的设计界面如图9-5所示,程序的运 行界面如图9-6所示。程序运行时,在文本 框中输入文本,按【保存】按钮将把输入 的文本保存到C:\EXAMPLE1.TXT文件中。 按【清空】按钮将把文本框中输入的文本 给清除。按【打开】按钮将把 C:\EXAMPLE1.TXT文件打开并把文件中的 内容显示在文本框中。按【退出】按钮将 退出应用程序。
WriteLine方法
该方法功能基本同Write方法,只是在写入数据的后 面加上行结束符
StreamReader类
(1)构造函数
[格式1]:public StreamReader(Stream stream); [格式2]:public StreamReader(string path);
(2)Read方法
(3)Delete方法
[格式]:public static void Delete(string path);
(4)Copy方法
[格式1]:public static void Copy(string sourceFileName,string destFileName); [格式2]:public static void Copy(string sourceFileName,string destFileName,bool overwrite);
图9-5 程序设计界面
图9-6 程序运行界面
3、Path类
Path类包含了对文件或目录路径字符串进行 操作的方法。Path类是静态类,所有的方法都 是静态的,常用方法包括: HasExtension方法:确定路径信息是否包括文 件扩展名 IsPathRooted方法:确定路径是包括绝对路径 信息还是相对路径信息 GetDirectoryName方法:获取路径的目录名称 GetFileName方法:获取路径的文件名