一个布尔型参数,它决定了数据传送的方向。当参数为TRUE时,将数据从对话框的控件传送到对应的数据成员中,当参数为FALSE时则将数据从数据成员中传给对应的控件。
4.1.2 VISUAL C++中文本文件的读写
在开发软件的过程中,程序员经常同文件系统打交道,读写各种文件。在VISUAL C++6.0环境下,程序员可以使用ANSI C/C++提供的标准文件操作方式,也可以使用Win32 API进行文件操作,更为简单的方法是利用MFC已经封装好的CFile系列的文件操作类来进行文件的读写操作[29]。
本文主要使用ANSI C/C++提供的标准文件操作方式,采用这种方式进行开发的优点是通用性,因此必然会无法利用特定操作系统的某些特性,例如Windows操作系统下的异步操作特性。
ANSI C/C++提供的标准文件操作函数有fopen、fclose、fgetc、fputc、fread、fwrite、feof、ferror等,本文用到的函数主要是[30]
1、fopen函数原型
FILE*fopen(const char*filename,const char*mode);
该函数的功能是打开一个文件,如果成功调用,返回一个文件指针;否则,返回NULL。 ● filename 参数 要打开的文件名称 ● mode 参数
文件打开的模式。可以使用的数值有r、w、a、r+、w+、a+,分别表示读文件、写文件、在文件尾部写、读写文件、打开空文件进行读写、在文件尾部读写。 2、fcolse函数原型
int fclose(FILE*stream);
该函数的功能是关闭一个文件,返回0表示成功,否则失败。 ● stream 参数
由fopen打开的文件指针。
ANSI C还提供了一个比较有用的关闭文件函数——_fcloseall,这个函数可以关闭所有打开的文件,但是不包括几个标准的输入、输出设备,即stdin、stdout、stderr。 下面一段代码演示了fopen、fclose、_closeall函数的用法。 /*FOPEN.C:这段程序打开了data,data2两个文件,
利用fclose关闭了data,利用_fcloseall关闭了其他的文件*/
#include
int numclosed; //打开文件,进行读
if((stream =fopen(“data”,“r”))==NULL) printf(“The file ‘data’was not opened\\n”); else
printf(“The file ‘data’was opened\\n”); //打开文件,进行写
if((stream2 =fopen(“data2”,“w+”))==NULL)
printf(“The file ‘data2’was not opened\\n”); else
printf(“The file ‘data2’was opened\\n”); //关闭文件
if(fclose(stream))
printf(“The file ‘data’was not opened\\n”); //关闭其他的文件
Numclosed =_fcloseall();
printf(“Number of files closed by _fcloseall:%u\\n”,numclosed); }
这段程序的输出结果为: The file ‘data’was opened The file ‘data2’was opened
Number of files closed by _fcloseall:1 3、fread函数原型
size_t fread(void*buffer,size_t size,size_t count,FILE*stream); ●buffer 参数
接受读入数据的缓冲区。 ●size 参数
打算读取的数据长度。 4、fwrite函数原型
size_t fwrite(const void*buffer,size_t size,size_t count, FILE*stream); 参数同fread。
下面这段代码演示了fread、fwrite的使用方法。 /*FREAD.C:
这段程序首先写入25个字符,然后读入25个字符 并且显示出读取字符的个数 */
#include
FILE*stream; char list[30];
int i,numread,numwritten; //打开文件
if((stream = fopen(“fread.out”,”w+t”))!=NULL) {
for(i=0;i<25;i++)
list[i]=(char)(‘z’-i); //写入字符
Numwritten=fwrite(list,sizeof(char),25,stream); printf(“Wrote %d items\\n”,numwritten);
fclose(stream);
} else
printf(“Problem opening the file\\n”);
if((stream =fopen(“fread.out”,”r+t”))!=NULL)
{ //读取字符
printf(“Number of items read = %d\\n”,numread); printf(“Contents of buffer = %.25s\\n”,list); fclose(stream); } else
printf(“File could not be opened\\n”); }
5、fprintf 函数原型
int fprintf( FILE *stream, const char *format [, argument ]...); 是用于文件操作的,printf就是在屏幕打印出一段字符串,是标准输出。
举例用法:
#include
int i = 10; double fp = 1.5;
char s[] = \char c = '\\n';
stream = fopen( \fprintf( stream, \fprintf( stream, \fprintf( stream, \fclose( stream );
system( \}
屏幕输出: this is a string 10 1.500000
4.1.3 VISUAL C++中APDL命令流文件读写的实现
在4.1.1和4.1.2中分别介绍了对话框编程中数据的提取和使用ANSI C/C++提供的标准文件进行操作,在本节中就将介绍利用这些方法来实现将APDL编写的命令流在VISUAL C++中写到文本文件中去。首先将APDL写的命令流生成一个LeaderAxis.txt文件,然后采用ANSI C/C++的fwrite函数将输入的参数写到创建的文本文件中,下面就以在VISUAL C++中,将阶梯轴有限元建模和网格划分的APDL命令流文件写入到指定的文本文件中为例,说明具体的实现过程,其用VISUAL C++编写的部分主要实现代码如下:
4.2 VISUAL C++调用ANSYS以批处理方式运行的实现
本文在VISUAL C++平台上对ANSYS进行封装,希望可以在前台处理系统和用户之间的交换,后台完成ANSYS的计算,这可以通过创建进程的方式来实现。
4.2.1 进程和线程
进程是正在执行的程序,程序是静态的代码和数据。同一个程序,可由多个进程执行。在操作系统内部,进程是位于核心区的一块内存结构,其中包含了虚拟地址空间、可执行代码、数据、对象句柄、环境变量、基本优先级、最小和最大工作集等有关信息。
线程是程序中的一个执行路径,它在进程上下文中执行。进程中的每个线程都独立运行。它们共享进程提供的各种资源:如代码、数据、虚拟地址空间等。每个线程可以执行进程中的不同代码,进程中的同一段代码也可以由多个线程执行。
操作系统创建了进程后,会创建一个线程执行进程中的代码。通常把这个线程成为该进程的主线程。主线程在执行过程中,可能会创建其它线程
[31]
。
在VISUAL C++中可以通过API函数CreateProcess创建进程去执行其它的程序,而且可以设置该进程的优先级。CreateProcess的函数原型是这样的:
BOOL CreateProcess(
LPCTSTR lpApplicationName,//应用程序名 LPTSTR lpCommandLine,//命令行
LPSECURITY_ATTRIBUTES lpProcessAttributes,//进程安全属性