第8章 数据流与文件的输入输出

第8章 数据流与文件的输入输出
第8章 数据流与文件的输入输出

第8章 C++的I/O系统

8.1 知识要点

1.C++语言的“流”是指信息从外部输入设备(如键盘、磁盘等)向计算机内部(内存)输入和从内存向外部输出设备(显示器、磁盘)输出的过程。这种输入输出过程被形象地比喻为“流”。

2.C++系统中的所有I/O类均包含在iostream.h 、fstream.h、strstream.h这三个系统头文件中。

3.C++系统编译预处理时,要对# include命令进行“文件包含”处理,把该命令中指定的文件中的全部内容嵌入到该命令的位置,再编译整个C++文件,生成相应的目标代码程序。“文件包含”命令可以节省程序设计人员的重复劳动,也可以共享一些相同的程序段。

C++语言不仅提供了现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了4个类对象,它们分别是cin、cout、cerr、clong

4.用格式控制符进行格式化输入、输出

5.所谓“文件”一般是指:存储在外部介质上的数据的集合。文件可用于存入程序代码,也可用于存放数据。

6.C++语言的文件名也是由文件的主名和扩展名两部分组成,它们之间用“.”号分隔。文件的主名是由用户命名的一个有效的C++标识符,为了同其他软件系统兼容,一般不超过8个有效字符。

7.C++语言把文件看作是一个字符(字节)序列,即由一个一个字符的数据顺序组成。根据数据的组织形式可分为ASCII文件和二进制文件两种。ASCII文件又称为文本(text)文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称为字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。

8.对文件的操作

要在程序中使用文件,就要在程序的开始包含预处理命令:

#include

对一般文件(主要是磁盘文件)的操作过程是:打开,读/写,关闭。

用户对标准I/O文件不需要进行打开/关闭,标准I/O文件函数分为以下三种:

(1)字符I/O函数字符输入函数getchar ( )和字符输出函数putchar ( )。

(2)字符串I/O函数字符串输入函数gets ( )和字符串输出函数puts ( )。

(3)格式化I/O函数格式化输入函数scanf ( )和格式化输出函数printf ( )。

9.对字符文件的操作

(1)字符文件

在字符文件中,以换行符‘\n’结束的一串字符称为记录;终端屏幕上输出的一行字符就相当于一条记录;交互输入时,用户通过键盘输入,以回车键结束的一串字符也是一条记录。

(2)向字符文件写入数据向字符文件写入数据有2种方法。

1)调用从ostream流类中继承来的插入操作重载函数。使用方法同交互输出过程,但这时插入操作符的第一个操作数应是某个定义过的文件对象而不是cout。

(3)从字符文件读取数据到内存变量从打开的字符文件中输入数据到内存变量有3种方法。

10.对字节文件(二进制文件)的操作

(1)字节文件

与字符文件不同的是,字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::binary选项

(2)建立二进制文件和write()成员函数一个文件被用户定义的一个文件流对象按字节方式打开后,通过文件流对象调用在ostream流类中定义的write()成员函数就能够向文件流对象所对应的文件中写入数据。

(3)访问二进制文件和read()成员函数

从字节文件读数据,就是把具有一定字节数的内容原原本本地复制到内存中由指定字符

指针所指向的内存缓冲区中,所读内容是从当前文件指针所指位置开始读取,然后文件指针自动向后移动所读取内容的字节数。

11.随机访问文件

(1)随机访问文件是可以使用位移量对其中的数据进行访问,“位移量”指以当前位置(开始点或当前位置或文件末尾)为基点,移动的字节数。

(2)C++语言既支持顺序访问文件也支持随机访问文件。为实现对文件的随机访问,fstream 文件类中定义了以下4个成员函数:seekg ( )、tellg ( )、seekp ( )和ellp ( )。seekg ( )和tellg ( )带后缀g表示get,这两个函数用于从文件中读取数据的情况;函数seekp ( )和tellp ( )带后缀p表示put,这两个函数用于向数据文件中写数据的情况。

8.2 例题分析

例题1:说明下面程序的格式控制符的作用

#include

#include

void main()

{ int number1=15;

double number2=6.54321;

cout<<"Decimal:"<

cout<<"Hexadecimal:"<

cout<<"Hexadecimal:"<

cout<<"Octal:"<

cout<

cout<

cout<< number2<

cout<

cout<

cout<< number2<

cout<

cout<< number2<

cout<

cout<< number2<

cout<

cout<

cout<< number2<

}

运行结果:

Decimal:15

Hexadecimal:f

Hexadecimal:F

Octal:17

6.54321

6.54

6.54

6.54

6.543E+000

6.5432

分析:程序中使用输入输出流格式控制符,必须包含头文件iomanip.h。

整型数number=15是个十进制数,dec控制符输出十进制数;hex控制符输出十六进制数f;setiosflags(ios::uppercase) 控制符输出大写十六进制数F;oct控制符输出八进制数17。

结果第5行没有设置有效位数,按流的默认值6位输出3.14159。

setprecision(3)控制符设置了3位有效位数,输出3.14。

setw(15)控制符设置了域宽为15,只影响下一个值的输出。

setiosflags(ios::left)设置了左对齐方式;

setiosflags(ios::right)设置了右对齐方式。

setiosflags(ios::scientific) 设置了指数表示方式。

setprecision(3)和setiosflags(ios::fixed) 共同设置了浮点数表示方式。

例题2:已知int a, *pa=&a;输出指针pa十进制的地址值的方法是()。

A.cout<

C.cout<<&pa; D.cout<

答案:D

分析:插入符输出指针类型对象的地址值时,默认为十六进制形式。如果要输出十进制形式的地址值,必须用类型long进行强制。答案A,输出了指针pa本身的值,也即变量a的地址值,不能选A。答案B中输出了指针pa所指向的对象,即变量a的值,不能选B。答案C,以十六进制形式输出指针pa的地址值,也不能选。

例题3:关于read()函数的下列描述中,()是对的。

A. A.函数只能从键盘输入中获取字符串

B. B.函数所获取的字符多少是不受限制的

C. C.该函数只能用于文本文件的操作中

D. D.该函数只能按规定读取所指定的字符数

答案:D

分析:read成员函数的使用格式是:read(char *buf,int size);

其中,buf用来存放读取到的字符指针或字符数组,size用来指定从输出流中读取字符的个数。read函数不仅可以从键盘输入中读取字符,也可以从任意输入流中获取信息,因此答案A错误。read函数读取的字符数受到size参数的限制,答案B错误。read函数不仅可以用于文本文件,也可以用于二进制文件,答案C错误。

例题4:某个类的输入、输出重载操作符>>和<<应定义为类的成员函数,描述正确吗?

答案:错误。

分析:由于重载插入符和提取符时,其左操作数是流,右操作数是类的对象,因此,插入符和提取符只能重载为友元函数。

例题5:下面程序建立了类triangle,用来存储直角三角形的宽与高。这个类的重载输出运算符函数在屏幕上显示三角形。

程序:

#include

class triangle

{ int height,base;

public:

triangle(int h,int b) {height=h;base=b; }

friend ostream& operator <<(ostream &stream,triangle ob);

};

ostream& operator <<(ostream &stream,triangle ob)

{ int i,j,h,k;

i=j=ob.base-1;

for(h=ob.height-1;h;h--)

{ for(k=i;k;k--)

stream<<' ';

stream<<'*';

if(j!=i)

{ for(k=j-i;k;k--)stream<<' ';

stream<<'*';

}

i--;

stream<

}

for(k=0;k

stream<

return stream;

}

void main()

{ triangle t1(5,5),t2(10,10),t3(12,12);

cout<

cout<

cout<

}

(1)插入符和提取符应重载为类的友元。

(2)插入符和提取符重载格式如下:

ostream& operator<<(ostream& s,const type& p)

{ //操作代码

return s;

}

istream& operator>>(istream& s, type& p)

{ //操作代码

return s;

}

其中左操作数是对ostream或istream对象的引用,右操作数接收将被输出或输入的对象。

(3)对重载的插入符或提取符的调用形式如下:

ostream<

istream>>obj;

分析:

(1)不清楚插入符和提取符应重载为类的友元。

(2)重载插入符和提取符格式错误。

(3)不清楚如何用重载后的插入符与提取符进行输入/输出。

例题6:从输入流中分析出数字串。例如:设输入串为

A012BCD378 274D

EF55G^Z

则输出为:

Digit string 1 is: 012

Digit string 2 is: 378

Digit string 3 is: 274

Digit stirng 4 is: 55

答案:

#include

#include

bool getnum(char *);

void main()

{ int i=1;

char buf[100];

while(getnum(buf))

{ cout<<"Digit string "<

cout<

i++;

}

}

bool getnum(char *s)

{ bool found(false);

char ch;

while(cin.get(ch)&&!isdigit(ch)) ;

if(!cin) return false;

do{

*s++=ch;

}while(cin.get(ch)&&isdigit(ch));

*s='\0';

found=true;

if(cin)

cin.putback(ch);

return found;

}

例题7:定义一个Dog类,包含体重和年龄两个数据成员及相应的成员函数。声明一个实例dog1,体重为5,年龄为10,使用I/O流把dog1的状态写入磁盘文件;再声明另一个实例dog2,通过读文件把dog1的状态赋给dog2。

答案:

#include

class Dog

{public:

Dog(int w,int a):weight(w),age(a) {}

~Dog() {}

int GetWeight() { return weight; }

int GetAge() { return age; }

void SetWeight(int w) { weight=w; }

void SetAge(int a) { age=a; }

private:

int age,weight;

};

int main()

{ char fileName[80];

cout<<"Please input the file name: ";

cin>>fileName;

ofstream fout(fileName);

if(!fout)

{ cout<<"Can't open the file "<

return(1);

}

Dog dog1(5,10);

fout.write((char*)&dog1,sizeof(dog1));

fout.close();

ifstream fin(fileName);

if(!fin)

{ cout<<"Can't open the file "<

return(1);

}

Dog dog2(0,0);

fin.read((char*)&dog2,sizeof(dog2));

fin.close();

cout<<"Dog2's weight: "<

cout<<"Dog2's age: "<

return 0;

}

8.3 教材习题解答

1.当使用ifstream流类定义一个对象并打开一个磁盘文件时,文件的隐含打开方式是什么?答:Ifstream myfile;

Myf ile.open(“filename”);

Open函数由两个参数组成,第一个参数是指定的文件路径名,第二个参数是打开模式,系统默认按ios::in方式打开,即为隐含打开方式。

2.当使用ofstream流类定义一个对象并打开一个磁盘文件时,文件的隐含打开方式是什么?

答:当用输出文件流对象调用open()成员函数打开一个文件时,打开方式参数也可以省略,即使用户指定了其他的打开方式,系统仍按默认的ios::out方式打开

3.当使用fstream流类定义一个对象并打开一个磁盘文件时,文件的隐含打开方式是什么?答:文件流类ifstream定义的对象实际上是一个输入文件;输出文件流类ofstream,文件流类ofstream定义的对象实际上是一个输出文件;输入输出(双向)文件流类fstream,文件流类fstream定义的对象实际上是一个既可读又可写的文件。所以当使用fstream流类定义一个对象并打开一个磁盘文件时,文件的隐含打开方式是ios::in | ios::out

4.若在程序文件中进行标准输入输出操作,则必须在文件开始的#include命令中使用哪一个头文件?

答:#include

5.若在程序文件中进行文件的输入输出操作,则必须在文件开始的#include命令中使用哪一个头文件?

答:#include

6.什么是格式状态标志?

答:格式状态标志是C++编译器提供的一种格式标记,有6种:left、right、showpoint、showpos、fixed和scientific。它们作为setiosflags和resetiosflags的参数使用,其类型为枚举型。格式化输入、输出使用到的格式控制符和格式状态标志均在根基类ios类中有定义

7.程序中有说明语句:

int a1; char a2 ; double a3 ;

根据下面的输出要求写出相应的cout语句。

(1)输出a1、a2、a3的值,每两个值之间用5个空格间隔。;

(2)以固定长度10按左对齐方式输出变量a1的值。

(3)以固定长度10按左对齐方式输出变量a1的值,如果a1值为正,要求输出前面的正号。(4)以固定长度15按右对齐方式输出变量a3的值,用填充字符*填充不足部分(用浮点数的定点数表示法表示)。

(5)以固定长度15、小数点后保留3位、按左对齐方式输出变量a3的值。

#include

Void main()

{ int a1; char a2 ; double a3 ;

Cin>>a1>>a2>>a3;

Cout<

Cout<

Cout<

Cout<

<

Cout<

<

}

8.现在需要打开empfile文件,进行文件更新操作,应使用什么语句来实现?

答:Fstream myfile;

Myfile.open(“c:\\empfile”, ios :: out);

9.在C++语言中,二进制文件可以用来存放哪些数据类型的数据?

答:字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::binary 选项。通常二进制文件的内容不能直接打印,也不允许用户直接阅读。但与字符文件相比它也有许多优点,如节省内存空间;可以存放结构类型的数据、记录等

10.执行完函数调用indata.seekg(0 ,ios : : end);后。函数indata.tellg()将返回什么值?

答:indata.seekg(0 ,ios : : end);表示从文件末尾开始移动0个字节,所以,indata.tellg()函数将返回该文件的末尾字节的索引值。

11.简述几种打开文件方式ios::in 、ios::out、ios::app及ios::in|ios::out之间的区别。

答:1)ios :: in:打开的文件是输入文件,既从该文件中读取数据,用于数据输入。

2)ios :: out:打开的文件是输出文件,既该文件用于写入数据,用于数据输出。

3)ios :: in | ios :: out:打开的文件既可以用于输入也可以用于输出。

12.如何判断打开文件操作是否成功?

答: fin . open ( file_ name , ios::in ) ;

if ( fin .fail ( ) ) //判断open语句执行是否成功,若不成功

//用cout语句输出文件打开失败提示信息

{ cout << “\n file open error on “ << file_name ;

exit (–1) ;

}

13.函数exit()的功能是什么?在程序中的作用是什么?

答:函数exit( )将强制程序结束执行,其格式为:

exit(-1 ) ;

它仅有一个整型参数,执行这条语句时,结束程序的执行,将控制权交还给操作系统,同时给出程序的结束状态-1。通常负的参数值代表程序的非正常结束。

14.函数close()实现什么操作?为什么完成对文件的操作后应及时关闭文件?

答:每个文件流类中都提供有一个关闭文件的成员函数close( ),当打开文件并在文件上执行完相应操作后,应将文件关闭。关闭任何一个流对象所对应的文件,就是利用这个流对象调用close( )成员函数,调用格式如下:

internalfilename.close ( ) ;

internalfilename是相应I/O类对象的名,close()成员函数没有参数。如果文件是以输出或添加方式打开的,操作系统将在close( )成员函数的作用下在文件的末尾加上文件结束符,断开程序与文件间的连接;如果文件是以输入方式打开的,close( )成员函数直接断开程序与文件间的连接。并能保证最后输出到文件缓冲区中的内容,无论是否已满都将立即写入到对应的文件中。当文件关闭后,文件对象不再存在,此时不能再对该文件进行任何操作。可再次使用open( )函数打开文件。

如果使用完文件后,没有使用close( )成员函数将程序与文件断开,则当程序结束执行时,操作系统将自动关闭文件。但应养成在使用完文件后立即将其关闭的好习惯。

15.顺序访问文件与随机访问文件之间的区别是什么?

答:顺序访问文件是指只能按数据的存放顺序依次进行读取;随机访问文件是可以使用位移量对其中的数据进行访问,“位移量”指以当前位置(开始点或当前位置或文件末尾)为基点,移动的字节数。

16.编写一个完整的C++程序,功能是读取一个文本文件的内容,并将文件内容以10行为单位输出到屏幕上,每输出10行就询问用户是否结束程序,不是则继续输出文件后面的内容。

程序:

# include < iostream . h >

# include < stdlib . h >

# include < fstream . h >

void main()

{ char ch ; // 使用ch读入字符

char y;

int j=0 // 使用j统计行数

ifsteam file4 ( “D: \\ write2 .dat “ ,ios::in | ios::nocreate ) ;

//定义输入文件流file4并打开D盘上的write2.dat文件

if ( ! file4 ) //判断文件打开操作是否成功,当file4打开失败提示有关信息{ cerr << “\n D:\\write2.dat not open “ << endl ;

exit (–1) ; }

while (f4.get (ch ) ) //依次从文件中输入字符到ch,当读到的是文件结束符时

// 条件表达式的值为0

{ cout << ch ;

if (ch = = …\n? ) j++ ; //如果是换行符,j值增加1

if( j%10==0)

{ cout<<”是否继续显示?Y/N”;

cin>y;

if( y==?y? || y==?Y?) continue;

else

break;

}

}

cout << endl << ” lines : “ << j << endl ;

file4.close ( ) ;

}

17.按下面每个题目的要求编写出相应的函数

(1)利用一个字符文件保存100以内的所有素数。

(2)利用一个字节文件保存10个100以内的随机整数,要求保存的所有值各不相同。程序:

(1)

# include < iostream . h >

# include < stdlib . h >

# include < fstream . h >

void main ( )

{ ofstream file1 ; // 定义输出文件流file1。

file1.open ( “A: \\ write1 .dat “ ) ;

// 调用open ( )成员函数打开A盘上的write1.dat

//文件。也可直接写为ofsteam file1(“A: \\ write1 .dat “ )

i f ( ! file1 )

//判断open语句执行是否成功,当file1打开失败则提示有关信息{ cerr << “\n A:\\write1.dat not open “ << endl ;

exit (–1) ; }

int flag=0;

file1<<2;

for (int k=3 ; k<=100 ; k++ )

{ Flag=1;

For( int j=2; j<=k-1;j++)

{ if( k%j==0)

{ flag=0;

Break;;

}

}

If ( flag==1)

file1 << k << “ “ ; // 向file1文件流写入k值

}

file1.close ( ) ; // 关闭file1所对应的文件

}

(2)

# include < stdlib . h >

# include < fstream . h >

#include

#include

#include

void main ( )

{ int x[10];

srand( (unsigned)time( NULL ) );

for ( int i=0;i<10;i++)

{ x[i]=rand();

}

ofstream file5 ; // 定义输入文件流file5

file5.open ( “d:\\bb1.dat “,ios :: out | ios :: binary) ;

// 调用open ( )成员函数打开d盘上的bb1.dat二进制文件

// 也可直接写为ofsteam file5(“d: \\ bb1 .dat “ , ios :: out | ios :: binary )if ( ! file5) //判断open语句执行是否成功,当file5打开失败提示有关信息。

{ cerr << “\n d:\\ bb1.dat not open “ << endl ;

exit (–1) ; }

for (int k=0 ; k<10 ; k++ ) //向f5所对应的二进制文件中写入每个元素的值file5 .write( (char * ) & x[k] , sizeof (int )) ;

//也可写为file5 .write( (char * ) & x[k] , 2 ) file5.close ( ) ; // 关闭file5所对应的文件

}

8.4 补充习题

1.已知int a, *pa=&a;,输出指针pa十进制的地址值的方法是()。

A.cout<

C.cout<<&pa; D.cout<

2.下列输出字符'A'的方法中,错误的是()。

A.cout<

C.cout.put('A'); D.char A='A';cout<

3.若已知char str[20];,有语句cin>>str;

当输入为:

This is a program

所得的结果是str=()。

A.This is a program B.This C.This is D.This is a

4.在下面格式化命令的解释中,错误的是()。

A.ios::skipws 跳过输入中的空白字符

B.ios::showpos 标明浮点数的小数点和后面的零

C.ios::fill() 读当前填充字符(缺省值为空格)

D.ios::precision() 读当前浮点数精度(缺省值为6)

5.当使用ifstream流定义流对象并打开一个磁盘文件时,文件的隐含打开方式为()。A.ios::in B.ios::out C.ios::in|ios::out D.ios::binary

6.istream和ostream类成员函数和把文件位置指针重定位到输入流与输出流中指定的位置。

7.在划线处填上适当的语句,完成如下程序。如果文件test.txt的内容如下:

Good Morning!

Good Night!

Good Lunky!

写出程序的运行结果。

#include

#include (1)

#include

(2) size=100;

void main()

{ char buf[size];

ifstream in("test.txt");

if((3) )

{ cout<<"Can't open the file test.txt."<

abort();

}

int i=1;

while(in.getline((4) ))

{ cout<

i++;

}

}

运行结果:(5)

8.写出下列程序的运行结果。

#include

void main()

{ cout<<"x_width="<

cout<<"x_fill="<

cout<<"x_precision="<

cout<<123<<" "<<123.45678<

cout<<"***x_width=10,x_fill=&,x_precision=8***"<

cout.width(10);

cout.fill('&');

cout.precision(8);

cout<<123<<" "<<123.45678<

cout.setf(ios::left);

cout<<123<<" "<<123.45678<

cout.width(10);

cout<<123<<" "<<123.45678<

cout<<"x_width="<

cout<<"x_fill="<

cout<<"x_precision="<

}

9.编写一个程序删除test.cpp文件中的所有以“//”开头的注释信息。

10.建立用户自定义二维点类Point,重载插入和提取运算符。其中,用户输入的数据以(x, y)形式表示,提取运算符判断输入的数据是否合法,如果是非法数据,则置位ios::failbit 以指示输入不正确。发生错误后,插入运算符函数显示错误提示信息;输入正确时则显示Point类的对象(点)的坐标信息。

数据流图画法要求

数据流图(DFD)画法要求 一、数据流图(DFD) 1.数据流图的基本符号 数据流图由四种基本符号组成,见图5-4-1所示。 图5-4-1 数据流图的基本符号 例:图5-4-2是一个简单的数据流图,它表示数据X从源S流出,经P加工转换成Y,接着经P加工转换为Z,在加工过程中从F中读取数据。 图5-4-2数据流图举例 下面来详细讨论各基本符号的使用方法。 2.数据流

数据流由一组确定的数据组成。例如“发票”为一个数据流,它由品名、规格、单位、单价、数量等数据组成。数据流用带有名字的具有箭头的线段表示,名字称为数据流名,表示流经的数据,箭头表示流向。数据流可以从加工流向加工,也可以从加工流进、流出文件,还可以从源点流向加工或从加工流向终点。 对数据流的表示有以下约定: 对流进或流出文件的数据流不需标注名字,因为文件本身就足以说明数据流。而别的数据流则必须标出名字,名字应能反映数据流的含义。 数据流不允许同名。 两个数据流在结构上相同是允许的,但必须体现人们对数据流的不同理解。例如图5-4-3(a)中的合理领料单与领料单两个数据流,它们的结构相同,但前者增加了合理性这一信息。 两个加工之间可以有几股不同的数据流,这是由于它们的用途不同,或它们之间没有联系,或它们的流动时间不同,如图5-4-3(b)所示。 (a)(b)(c) 图5-4-3 简单数据流图举例 数据流图描述的是数据流而不是控制流。如图5-4-3 (c)中,“月末”只是为了激发加工“计算工资”,是一个控制流而不是数据流,所以应从图中删去。 3.加工处理 加工处理是对数据进行的操作,它把流入的数据流转换为流出的数据流。每个加工处理都应取一个名字表示它的含义,并规定一个编号用来标识该加工在层次分解中的位置。名字中必须包含一个动词,例如“计算”、“打

数据流图(DFD)专题讲解

软件设计师考试的下午题的第一道题,数据库系统工程师考试的下午题的第一道题都是数据流图题,而能够将这道题全部做对的考生是非常少的。根据历年的辅导和阅卷经验,发现很多考生不是因为这方面的解题能力不够,而是缺乏解这种题的方法与技巧。本文介绍一些解这种类型题的方法和技巧,希望起来抛砖引玉的效果。 一.解题当中考生表现出的特点 由于这是下午考试的第一道题,所以很多考生从考前的紧张氛围当中逐渐平静下来开始答题,头脑还比较清醒,阅读起来比较流畅,速度还可以,自我感觉不错。可偏偏这道题有很多人不能全取15分,纠其原因有以下一些特点: 1.拿卷就做,不全面了解试卷,做到心中有数。这样会导致在解题过程当中缺少一种整体概念,不能明确自己在哪些题上必需拿分(多花时间),哪些题上自己拿不了分(少花时间)。这样,在解题时目标就会明确很多。 2.速度快,读一遍题就开始动手做。 3.速度慢,用手指逐个字的去看,心想看一遍就能做出题来。 4.在阅读题目时,不打记,不前后联系起来思考。 5.边做边怀疑边修改,浪费时间。

6.缺少的数据流找不准,可去掉的文件找不出来。 7.由于缺少项目开发经验,对一些事务分析不知如何去思考。 8.盲目乐观,却忽略了答题格式,丢了不应该丢的分。 二.解题的方法与技巧 1.首先要懂得数据流图设计要略。 有时为了增加数据流图的清晰性,防止数据流的箭头线太长,减少交叉绘制数据流条数,一般在一张图上可以重复同名的数据源点、终点与数据存储文件。如某个外部实体既是数据源点又是数据汇点,可以在数据流图的不同的地方重复绘制。在绘制时应该注意以下要点: (1)自外向内,自顶向下,逐层细化,完善求精。 (2)保持父图与子图的平衡。 为了表达较为复杂问题的数据处理过程,用一个数据流图往往不够。一般按问题的层次结构进行逐步分解,并以分层的数据流图反映这种结构关系。根据层次关系一般将数据流图分为顶层数据流图、中间数据流图和底层数据流图,除顶层图外,其余分层数据流图从0开始编号。对任何一层数据流图来说,称它的上层数据流图为父图,在它的下一层的数据流图为子图。

文件流是以外存文件为输入输出对象的数据流

文件流是以外存文件为输入输出对象的数据流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据读入。字符串流也称为内存流。 字符串流也有相应的缓冲区,开始时流缓冲区是空的。如果向字符数组存入数据,随着向流插入数据,流缓冲区中的数据不断增加,待缓冲区满了(或遇换行符),一起存入字符数组。如果是从字符数组读数据,先将字符数组中的数据送到流缓冲区,然后从缓冲区中提取数据赋给有关变量。 在字符数组中可以存放字符,也可以存放整数、浮点数以及其他类型的数据。在向字符数组存入数据之前,要先将数据从二进制形式转换为ASCII代码,然后存放在缓冲区,再从缓冲区送到字符数组。从字符数组读数据时,先将字符数组中的数据送到缓冲区,在赋给变量前要先将ASCII代码转换为二进制形式。总之,流缓冲区中的数据格式与字符数组相同。这种情况与以标准设备(键盘和显示器)为对象的输入输出是类似的,键盘和显示器都是按字符形式输入输出的设备,内存中的数据在输出到显示器之前,先要转换为ASCII码形式,并送到输出缓冲区中。从键盘输入的数据以ASCII码形式输入到输入缓冲区,在赋给变量前转换为相应变量类型的二进制形式,然后赋给变量。对于字符串流的输入输出的情况,如不清楚,可以从对标准设备的输入输出中得到启发。 文件流类有ifstream,ofstream和fstream,而字符串流类有istrstream,ostrstream和strstream。文件流类和字符串流类都是ostream,istream和iostream类的派生类,因此对它们的操作方法是基本相同的。向内存中的一个字符数组写数据就如同向文件写数据一样,但有3点不同: 1. 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据。在严格的意义上 说,这不属于输入输出,称为读写比较合适。因为输入输出一般指的是在计算机内存与计算机外的文件(外部设备也视为文件)之间的数据传送。但由于C++的字符串流采用了C++的流输入输出机制,因此往往也用输入和输出来表述读写操作。 2. 字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。 3. 每个文件的最后都有一个文件结束符,表示文件的结束。而字符串流所关联的字符数组中没有相应的结束标志,用户要指定 一个特殊字符作为结束符,在向字符数组写入全部数据后要写入此字符。 字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。即通过调用构造函数来解决此问题。建立字符串流对象的方法与含义如下。 建立输出字符串流对象 ostrstream类提供的构造函数的原型为: ostrstream::ostrstream(char *buffer,int n,int mode=ios::out); buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同),第3个参数是可选的,默认为ios::out方式。可以用以下语句建立输出字符串流对象并与字符数组建立关联: ostrstream strout(ch1,20); 作用是建立输出字符串流对象strout,并使strout与字符数组ch1关联(通过字符串流将数据输出到字符数组ch1),流缓冲区大小为20。 建立输入字符串流对象 istrstream类提供了两个带参的构造函数,原型为: istrstream::istrstream(char *buffer); istrstream::istrstream(char *buffer,int n); buffer是指向字符数组首元素的指针,用它来初始化流对象(使流对象与字符数组建立关联)。可以用以下语句建立输入字符串流对象: istrstream strin(ch2); 作用是建立输入字符串流对象strin,将字符数组ch2中的全部数据作为输入字符串流的内容。 istrstream strin(ch2,20); 流缓冲区大小为20,因此只将字符数组ch2中的,20个字符作为输入字符串流的内容。 建立输入输出字符串流对象 strstream类提供的构造函数的原型为: strstream::strstream(char *buffer,int n,int mode); 可以用以下语句建立输入输出字符串流对象:

第8章 数据流与文件的输入输出

第8章 C++的I/O系统 8.1 知识要点 1.C++语言的“流”是指信息从外部输入设备(如键盘、磁盘等)向计算机内部(内存)输入和从内存向外部输出设备(显示器、磁盘)输出的过程。这种输入输出过程被形象地比喻为“流”。 2.C++系统中的所有I/O类均包含在iostream.h 、fstream.h、strstream.h这三个系统头文件中。 3.C++系统编译预处理时,要对# include命令进行“文件包含”处理,把该命令中指定的文件中的全部内容嵌入到该命令的位置,再编译整个C++文件,生成相应的目标代码程序。“文件包含”命令可以节省程序设计人员的重复劳动,也可以共享一些相同的程序段。 C++语言不仅提供了现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了4个类对象,它们分别是cin、cout、cerr、clong 4.用格式控制符进行格式化输入、输出 5.所谓“文件”一般是指:存储在外部介质上的数据的集合。文件可用于存入程序代码,也可用于存放数据。 6.C++语言的文件名也是由文件的主名和扩展名两部分组成,它们之间用“.”号分隔。文件的主名是由用户命名的一个有效的C++标识符,为了同其他软件系统兼容,一般不超过8个有效字符。 7.C++语言把文件看作是一个字符(字节)序列,即由一个一个字符的数据顺序组成。根据数据的组织形式可分为ASCII文件和二进制文件两种。ASCII文件又称为文本(text)文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称为字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 8.对文件的操作 要在程序中使用文件,就要在程序的开始包含预处理命令: #include 对一般文件(主要是磁盘文件)的操作过程是:打开,读/写,关闭。 用户对标准I/O文件不需要进行打开/关闭,标准I/O文件函数分为以下三种: (1)字符I/O函数字符输入函数getchar ( )和字符输出函数putchar ( )。 (2)字符串I/O函数字符串输入函数gets ( )和字符串输出函数puts ( )。 (3)格式化I/O函数格式化输入函数scanf ( )和格式化输出函数printf ( )。 9.对字符文件的操作 (1)字符文件 在字符文件中,以换行符‘\n’结束的一串字符称为记录;终端屏幕上输出的一行字符就相当于一条记录;交互输入时,用户通过键盘输入,以回车键结束的一串字符也是一条记录。 (2)向字符文件写入数据向字符文件写入数据有2种方法。 1)调用从ostream流类中继承来的插入操作重载函数。使用方法同交互输出过程,但这时插入操作符的第一个操作数应是某个定义过的文件对象而不是cout。 (3)从字符文件读取数据到内存变量从打开的字符文件中输入数据到内存变量有3种方法。 10.对字节文件(二进制文件)的操作 (1)字节文件 与字符文件不同的是,字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::binary选项 (2)建立二进制文件和write()成员函数一个文件被用户定义的一个文件流对象按字节方式打开后,通过文件流对象调用在ostream流类中定义的write()成员函数就能够向文件流对象所对应的文件中写入数据。 (3)访问二进制文件和read()成员函数 从字节文件读数据,就是把具有一定字节数的内容原原本本地复制到内存中由指定字符

文件与数据流

第8章文件与数据流 一、文件和流的概念 文件是指在各种驱动器上(硬盘、可移动磁盘等)永久或临时存储的数据的有序集合,是进行数据读/写操作的基本对象。文件通常具有文件名、路径、访问权限等属性。 流从概念上来说类似于单独的磁盘文件,它也是进行读/写操作的对象。流提供了连续的字节存储空间,通过流可以向后备的存储器写入数据,也可以从后备存储器读取数据。 与磁盘文件直接相关的流称为“文件流”。除此之外,还有网络流、内存流等其他类型的流。 流用于传输数据时,有两个传输方向: 读:将数据从外部数据源传输到程序中,这是读取流。 写:将数据从程序传输到外部数据源,这是写入流。

二、相关知识 1.流的创建 FileStream fs = new FileStream( "test1.dat", FileMode.Create, FileAccess.Write); 一般格式: FileStream fs = new FileStream( string path, FileMode mode, FileAccess access); 参数含义: path:指定当前FileStream对象将封装的文件的相 对路径或绝对路径。可以只是文件名(在程 序所在目录下创建或打开文件) mode:指定如何打开或创建文件,它的值必须是 FileMode枚举中的值。 access:指定如何访问文件,它的值必须是 FileAccess枚举中的值。 2)将数据写入流 fs.write(byte[] array,int offset,int count); 参数含义: array:要写入文件流的字节数组 offset:array数组中开始写入文件流的字节的下 标。 count:将要写入流的最大字节数 3)从流中读取数据 fs.ReadByte()从流中读取一个字节(返回已转换 为int的字节),并将流内的位置向前推进一个。 如果已经到达流的末尾,则返回-1。 在读之前,用canRead属性确定当前对象是否支持

数据流图试题及答案

数据流图试题及答案https://www.360docs.net/doc/5a3399279.html,work Information Technology Company.2020YEAR

【问题1】(1)费用单 (2)待租赁房屋列表 (3)看房请求 (4)变更房屋状态请求 【问题2】(5)房主信息文件 (6)租赁者信息文件 (7)房屋信息文件 (8)看房记录文件 【问题3】(1)起点:房主终点:变更房屋状态数据流名称:变更房屋状态请求 (2)起点:租赁者终点:登记租赁者信息数据流名称:租赁者信息 (3)起点:租赁者终点:安排租赁者看房数据流名称:看房请求 试题一(共15分) 阅读以下说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下: 1. 每门课程都有3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课 程的考试成绩。

2. 学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。 3. 在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。 4. 对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。 5. 若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。 6. 在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告返还系统。 7. 根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。 现采用结构化方法对这个系统进行分析与设计,得到如图1-1所示的顶层数据流图和图1-2所示的0层数据流图。 图1-1 顶层数据流图

关于数据流文件的一些信息

关于数据流文件的一些信息 又是一篇关于Windows,NTFS和cmd的帖子哈~貌似本板块可以改名为中国cmd联盟了~嘻嘻~废话不多说,进入正题你用过卡巴斯基么?是不是每次复制文 件都会显示这个:screen.width*0.7){this.resized=true; this.width=screen.width*0.7;this.alt='Click here to open new window';}"哈哈,这个就是今天我们要讨论的话题:NTFS数据流。NTFS分区 的数据流是一个子文件系统允许额外的数据连接到一个特别的文件中,现在的FAT文件系统格式是不支持数据流格式的。简单点说就是给在NTFS分区格式的 文件添加了一个标记。除了上面举的卡巴斯基的例子,在WinRAR添加压缩文件时,在高级选项中就有"保存文件数据流"的选项。再看看卡巴斯基对NTFS数据流干了些什么,Kaspersky把文件的验证指纹信息保存到NTFS数据流里面,如 果病毒/木马修改了这个文件,Kaspersky就会很快发现文件校检有误,这就是 为什么Kaspersky安装完毕要必须"全盘检查"一次,这样可以大幅度加快以后 的病毒检查速度!那么,怎样添加NTFS数据流呢?这就和cmd有关了CODE:[Copy to clipboard]dir C:1.txt看看1.txt里的内容,记住哦~然后CODE:[Copy to clipboard]dir c:2.txt:stream.txt怎么样,糊涂了吧~先看看 2.txt的属性:0 Bytes,打开2.txt看看有什么?什么都没了~然后在输入:CODE:[Copy to clipboard]notepad 2.txt:stream.txt看看,出来什么了? 惊讶吧~其实每个文件都可以有多个流的,用这个NTFS的特性我们可以隐藏文 件哦~而且,还可以,隐藏木马^_^实际上,流还可以不依赖于文件,下面的命令 也是合法的(先不要试,否则可能会有点麻烦):CODE:[Copy to clipboard]dir e::stream.txt这是把流绑到了文件夹上,这种流就更隐蔽了,一般情况下 要想删除流只有将其宿主删除,如果你执行了刚才的命令,并且是在根文件夹 上执行的,如果你想删除它,那就恭喜你要格盘了:),不过有现成的工具可以 使用的,这个就是:Streams v1.53 Reveal NTFS alternate streams这么样,又是sysinternal的作品哦~我要说的就说完了,下面是网上收集的关于NTFS 流的资料了Quote:NTFS上的交换数据流NTFS上的交换数据流转载:来源不详--目录--1、前言2、概念3、性质和应用-3.1创建-3.2删除-3.3检测与提取-3.4保存与传输-3.5文件隐藏-3.6运行-3.7与IIS相关4、附言5、参考文章--1、前言交换数据流(alternate data streams,以下简称ADS)也不是什么新

实验三 文件与数据流 实验报告

实验三文件与数据流实验报告 一、实验目的 1. 掌握输入输出流类的层次关系和类中的方法及输入输出流的编程方法。 2. 理解对象序列化。 二、实验要求 1. 利用InputStream(抽象类)的子类FileInputStream以及BufferedInputStream类对文件进行读入操作。BufferedInputStream相对于FileInputStream类而言增加了缓存,减少了IO 操作,在一定程序上提升了程序的性能。同理,利用OutputStream的子类FileOutputStream 和BufferedOutputStream类进行文件的输出操作。 2. 通过DataInputStream和DataOutputStream对象进行基本数据类型的写入文件和从文件读出的操作。 3. 通过ObjectInputStream和ObjectOutputStream可以直接把对象写入到文件或者从文件中读出。同时,如果要使对象能够通过这个类写入到文件中,这个类需要实现Serializable 接口。 三、实验内容 1. 将文件f1.txt的内容加密(字母’A’ 变为’C’,字母’B’ 变为字母‘D’,…,字母‘Z’ 变为’B’)后存放到f 2.txt中。读出f2.txt文件的内容,并显示解密后的内容。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileExperiment00 { public static void main(String[] args) { try { encrypt(); decrypt(); } catch (Exception e) { e.printStackTrace(); } } public static void encrypt() throws Exception { File f1 = new File("f1.txt"); File f2 = new File("f2.txt"); if (!f1.exists()) { System.out.println("文件不存在"); return; } if (!f2.exists()) {

数据流总结 文档

[分享]业务流程图/数据流图/数据字典/系统流程图 业务流程图是一种描述系统内各单位、人员之间业务关系、作业顺序和管理信息流向的图表,利用它可以帮助分析人员找出业务流程中的不合流理向,它是物理模型。 业务流程图主要是描述业务走向,比如说病人吧,病人首先要去挂号,然后在到医生那里看病开药,然后再到药房领药,然后回家。 业务流程图描述的是完整的业务流程,以业务处理过程为中心,一般没有数据的概念。 数据流程图是一种能全面地描述信息系统逻辑模型的主要工具,它可以用少数几种符号综合地反映出信息在系统中的流动、处理和存储情况,数据流程图是逻辑模型。 数据流程则是描述数据的走向,继续以病人为例,这个时候主要画的是病人挂号系统需要那些表,数据改怎么存,医生看病用到那些表,数据改怎么存等。 数据流程图进一步舍去物质要素,收集有关资料,用计算机进行信息管理,为下一步分析做好准备。 数据流图描述的是处理和数据,不重点突出流程的先后,以处理和数据流、数据存储为核心。 数据流图是描述各个子块之间如何进行数据传递:数据字典相当于数据库中的对照表,把你认识的符号和系统中的符号对应起来! 数据字典是记载整个工程的数据。如:格式,数据库中的表格中的字段名,窗口数... 系统流程图是在系统分析员在做系统构架阶段,或者说,在接触实际系统时,对未来构建的信息处理系统的一种描述。这种描述是相对简单且完全的,涉及到未来系统中使用的处理部件,如磁盘,显示器,用户输入以及处理过程的先后顺序表示等,标准的系统流程图应该有10种图元,具体的看国标吧。当然,系统流程图还可以用来表示现有的信息系统处理过程涉及的各个部件以及次序。 数据流程图是在系统分析员在系统设计阶段,对实际构建的系统分析综合后,提取逻辑模型的一个过程,它更关注于过程内数据的处理,而把具体处理数据的物理过程,物理分布忽略。实际上,最初始的数据流程图标准图元只有四个!实体,过程,数据流,数据的存储。并且,数据流的分析过程是逐步对实际过程求精的,从顶层数据流图,到分层数据流图,数据流,过程类型也逐步增加,直到形成最后的数据字典和底层数据流图。有关数据流程图的画法,可以参照软件工程教科书中的描述,可惜的是,教科书中的流程图都不符合国家标准的,不过大体的意思是一致的。 具体在项目设计的时候,上述两个表达方式都是可行的,需要视项目的类型以及规模。如果项目是一般的工程类应用MIS,基于过程的处理,则DFD的分析方法是很管用的,先设计系统流程图,在做系统数据流程图,然后是数据库设计等等等啊;如果是做开发产品级类项目,哈哈,那可就不一定很适用了。authored by fincs [原创]业务流程图与数据流程图的区别 今日突然让我写同一个方案的业务流程图和数据流程图,才想起来很多人已经把业务流程图和数据流程图混为一谈了,上网本想查一下二者的权威性解释,竟然都是作者都糊涂的文章。自己把大学学的知识回忆了一下,大概是这样的: 数据流图中的那些框框是人,或者数据的载体,如数据库,而线记载的是数据,如交货单,数据流图的作用主要是解释一个系统方案中的数据是如何流转的,由谁发出的,流转到哪里去,流转的过程中发生了什么变化。数据流图的读者一般是技术性较强的人,如程序员。数据流图更多的是用于程序设计和开发。

相关主题
相关文档
最新文档