晶's profile有那么一个角落PhotosBlogLists Tools Help

Blog


    August 10

    データ構造のスタックについて

    スタック [Stack]

    スタックは要素の挿入と削除がリストの先頭だけで行われるLIFOのデータ構造です
    LIFO(Last In, First Out) とは「最後に入ったものが最初に出てゆく」という意味です。

    積み重なった本をイメージするとわかりやすいです。
    最初に置かれたものは底にあって、最後に置かれたものは最上に位置します。最初に置かれたものを取り出すには最後に置かれたものを順番に取り出していかなければなりません。

    スタックでは要素を挿入する(積む)操作を push 、要素を削除する(取り出す)操作を pop と言います。またリストの先頭(頂上)を top 、終端(底)を bottom と呼びます。

    スタックは時系列にデータを保持したいときによく使われるデータ構造です。テキストエディタにある「元に戻す」機能が良い例です。

    データ構造のリストと配列

    ☆リストは要素が順番に並んだデータ構造です。列、並び - sequence とも呼ばれます。リストという語はヴェクターまたは配列と同異義で使われることもあります。

    一般的には同じデータ型の要素を保持します。要素は順番に並べられ、順序付けには連続した範囲の整数が使用されます。個々の要素へアクセスするにはインデックス(順序番号)を指定します。

     

    配列との微妙な違い

    プログラミングにおいては配列とリストを区別する必要はないのですが、両者の定義は違います。

    配列はあらかじめ要素の数が決まっている(不変)がリストは決まっていません(可変)。また、格納できるデータの型も配列の場合はあらかじめ決められたデータ型のみ格納できるのに対し、リストはどんな型でも格納できます。

    配列のデータに配列を用いれば多次元の配列が生まれます。これを多次元配列と呼びます。リストにリストを格納すれば「多次元リスト」ですが、こう呼ばれることはほとんど聞いたことがありません。

    抽象データ構造とクラスについて

    ☆抽象データ型とクラス

    これから見てゆく各データ構造の解説は、抽象データ型 [Abstract Data Type/ADT]およびクラスの説明でもあります。

    抽象データ型、クラス、この2つの概念は同じです。 データ構造とそれに付随する操作をひとまとまりに表現したものを抽象データ型またはクラスと呼ぶのです。

    Java や C++ など、プログラミング言語がオブジェクト指向プログラミングをサポートするならクラスとして定義され、オブジェクト指向プログラミングをサポートしないなら抽象データ型と呼ばれるプログラミングになります。

    抽象データ型、クラスにあたるデータ構造には以下のようなものがあります。

    • スタック
    • キュー

    各データ構造の実際は後に見てもらうとして、「プログラムにおけるデータ構造は抽象データ型またはクラスでもある」ということを覚えておいてください。

    データ構造について

    データ構造とはデータを保持する形式や方法です。
    もっとコンピュータに近い説明だと「メモリ上での表現方法」となります。「データをメモリ上にどのように展開/保持するか」ということです。

    このセクションではデータ構造の説明と各データ構造に付随する操作を解説します。

    木構造について

    ここでは木構造(木、ツリー)と呼ばれる新しいデータ構造を見ていきます。

    木は階層的な関係を表現します。概念図は次のようになります。

    木構造に関する用語は非常に多いので、順番に見ていきましょう。

    まず、概念図の  の部分を節(ノード)といいます。C言語でいえば、この部分を構造体にして表現します。

    木構造では、節は階層関係を持っています。ある節に注目したとき、その節の1つ上にある節を といいます。逆に1つ下の節をといいます。1つ以上、上にある節は全て先祖であり、1つ以上下にある節は全て 子孫です。

    1つの木構造について、最も上にある節のことを特に、根(ルート)といいます。また、子を1つも持たない節のことをといいます。結果的に、一番下にある節が葉ということになります。

    ところで、各節は0個以上の子を持つことができます。幾つの子を持つかは自由ですが、これに関して特定の決まりを持った木構造には、特別な名前が付いていることがあります。この章で紹介する二分木 は、節が最大で2個の子を持つ木構造です。概念図でみた木構造は、根が3つの子を持っているので、二分木ではありません。これは多分木と呼ばれます。多分木は、節が最大でm個の子を持つ木構造のことをいい、m分木と表現することができます。m=2なら、二分木ということになります。

     

    C++ 的各种文件读写操作总结

    在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是:

    1、基于C的文件操作;

    2、基于C++的文件操作;

    3、基于WINAPI的文件操作;

    4、基于BCB库的文件操作;

    5、特殊文件的操作。

    壹、基于C的文件操作
      在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实现三个功能

    为使用而打开一个流
    把一个文件和此流相连接
    给此流返回一个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()
      向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。

    例:fputc('X',fp);

    4.fgetc()
      从流中读一个字符,原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。

    例:char ch1=fgetc(fp);

    5. fseek()
      此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是

    符号常量 值 基准位置
    SEEK_SET 0 文件开头
    SEEK_CUR 1 当前读写的位置
    SEEK_END 2 文件尾部

    例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)

      fseek(fp,0L,2);//把读写位置移动到文件尾

    6.fputs()
      写一个字符串到流中,原型int fputs(const char *s, FILE *stream);

    例:fputs("I Love You",fp);

    7.fgets()
      从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。

    例:如果一个文件的当前位置的文本如下

    Love ,I Have

    But ……..

    如果用

      fgets(str1,4,file1);

    则执行后str1="Lov",读取了4-1=3个字符,而如果用

      fgets(str1,23,file1);

    则执行str="Love ,I Have",读取了一行(不包括行尾的'\n')。

    8.fprintf()
      按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了

    例:fprintf(fp,"%2d%s",4,"Hahaha");

    9.fscanf()
      从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, …]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。

    例:fscanf(fp,"%d%d" ,&x,&y);

    10.feof()
      检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);

    例:if(feof(fp))printf("已到文件尾");

    11.ferror()
      原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream);

    例:printf("%d",ferror(fp));

    12.rewind()
      把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);

    例:rewind(fp);

    12.remove()
      删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。

    例:remove("c:\\io.sys");

    13.fread()
      从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

    例:

      char x[4230];
      FILE *file1=fopen("c:\\msdos.sys","r");
      fread(x,200,12 ,file1);//共读取200*12=2400个字节

    14.fwrite()
      与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

    例:

      char x[]="I Love You";
      fwire(x, 6,12,fp);//写入6*12=72字节

      将把"I Love"写到流fp中12次,共72字节

    15.tmpfile()
      其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。

    例:FILE *fp=tmpfile();

    16.tmpnam();
      其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。

    例:tmpnam(str1);


    二、直接I/O文件操作
      这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的“句柄”来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号。此类文件操作常用的函数如下表,这些函数及其所用的一些符号在io.h和fcntl.h中定义,在使用时要加入相应的头文件。

    函数 说明
    open() 打开一个文件并返回它的句柄
    close() 关闭一个句柄
    lseek() 定位到文件的指定位置
    read() 块读文件
    write() 块写文件
    eof() 测试文件是否结束
    filelength() 取得文件长度
    rename() 重命名文件
    chsize() 改变文件长度

      下面就对这些函数一一说明:

    1.open()
      打开一个文件并返回它的句柄,如果失败,将返回一个小于0的值,原型是int open(const char *path, int access [, unsigned mode]); 参数path是要打开的文件名,access是打开的模式,mode是可选项。表示文件的属性,主要用于UNIX系统中,在DOS/WINDOWS这个参数没有意义。其中文件的打开模式如下表。

    符号 含义 符号 含义 符号 含义
    O_RDONLY 只读方式 O_WRONLY 只写方式 O_RDWR 读/写方式
    O_NDELAY 用于UNIX系统 O_APPEND 追加方式 O_CREAT 如果文件不存在就创建
    O_TRUNC 把文件长度截为0 O_EXCL 和O_CREAT连用,如果文件存在返回错误 O_BINARY 二进制方式
    O_TEXT 文本方式

      对于多个要求,可以用"|"运算符来连接,如O_APPEND|O_TEXT表示以文本模式和追加方式打开文件。

    例:int handle=open("c:\\msdos.sys",O_BINARY|O_CREAT|O_WRITE)

    2.close()
      关闭一个句柄,原型是int close(int handle);如果成功返回0

    例:close(handle)

    3.lseek()
      定位到指定的位置,原型是:long lseek(int handle, long offset, int fromwhere);参数offset是移动的量,fromwhere是移动的基准位置,取值和前面讲的fseek()一样,SEEK_SET:文件首部;SEEK_CUR:文件当前位置;SEEK_END:文件尾。此函数返回执行后文件新的存取位置。

    例:

      lseek(handle,-1234L,SEEK_CUR);//把存取位置从当前位置向前移动1234个字节。
      x=lseek(hnd1,0L,SEEK_END);//把存取位置移动到文件尾,x=文件尾的位置即文件长度

    4.read()
      从文件读取一块,原型是int read(int handle, void *buf, unsigned len);参数buf保存读出的数据,len是读取的字节。函数返回实际读出的字节。

    例:char x[200];read(hnd1,x,200);

    5.write()
      写一块数据到文件中,原型是int write(int handle, void *buf, unsigned len);参数的含义同read(),返回实际写入的字节。

    例:char x[]="I Love You";write(handle,x,strlen(x));

    7.eof()
      类似feof(),测试文件是否结束,是返回1,否则返回0;原型是:int eof(int handle);

    例:while(!eof(handle1)){……};

    8.filelength()
      返回文件长度,原型是long filelength(int handle);相当于lseek(handle,0L,SEEK_END)

    例:long x=filelength(handle);

    9.rename()
      重命名文件,原型是int rename(const char *oldname, const char *newname); 参数oldname是旧文件名,newname是新文件名。成功返回0

    例:rename("c:\\config.sys","c:\\config.w40");

    10.chsize();
      改变文件长度,原型是int chsize(int handle, long size);参数size表示文件新的长度,成功返回0,否则返回-1,如果指定的长度小于文件长度,则文件被截短;如果指定的长度大于文件长度,则在文件后面补'\0'。

    例:chsize(handle,0x12345);


    --------------------------------------------------------------------------------

      如果熟悉汇编可能会发现这种方式和汇编语言的DOS功能调用句柄式文件操作很像,比如open()就像DOS服务的3CH号功能调用,其实这种操作还有两种类型的函数就是直接用DOS功能来完成的,如_open(),_dos_open()等等。有兴趣可自已查询BCB的帮助。

      同流式文件操作相同,这种也提供了Unicode字符操作的函数,如_wopen()等等,用于9X/NT下的宽字符编程,有兴趣可自已查询BCB的帮助。

      另外,此种操作还有lock(),unlock(),locking()等用于多用户操作的函数,但在BCB中用得并不多,我就不介绍了,但如果要用C来写CGI,这些就必要的常识了,如果你有这方面的要求,那就得自已好好看帮助了。

      在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:

    1、插入器(<<)
      向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出流。

    2、析取器(>>)
      从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。

      在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。

    一、打开文件
      在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

    void open(const char* filename,int mode,int access);

    参数:

    filename:  要打开的文件名
    mode:    要打开文件的方式
    access:   打开文件的属性
    打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

    ios::app:   以追加的方式打开文件
    ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性
    ios::binary:  以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
    ios::in:    文件以输入方式打开
    ios::out:   文件以输出方式打开
    ios::nocreate: 不建立文件,所以文件不存在时打开失败 
    ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
    ios::trunc:  如果文件存在,把文件长度设为0
      可以用“或”把以上属性连接起来,如ios::out|ios::binary

      打开文件的属性取值是:

    0:普通文件,打开访问
    1:只读文件
    2:隐含文件
    4:系统文件
      可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

      例如:以二进制输入方式打开文件c:\config.sys

      fstream file1;
      file1.open("c:\\config.sys",ios::binary|ios::in,0);

      如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:

      file1.open("c:\\config.sys");<=>file1.open("c:\\config.sys",ios::in|ios::out,0);

      另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:

      fstream file1("c:\\config.sys");

      特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。

      ifstream file2("c:\\pdos.def");//以输入方式打开文件
      ofstream file3("c:\\x.123");//以输出方式打开文件

      所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。

    二、关闭文件
      打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。

    三、读写文件
      读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式

      1、文本文件的读写
      文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:

      file2<<"I Love You";//向文件写入字符串"I Love You"
      int I;
      file1>>I;//从文件输入一个整数值。

      这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些

    操纵符 功能 输入/输出
    dec 格式化为十进制数值数据 输入和输出
    endl 输出一个换行符并刷新此流 输出
    ends 输出一个空字符 输出
    hex 格式化为十六进制数值数据 输入和输出
    oct 格式化为八进制数值数据 输入和输出
    setpxecision(int p) 设置浮点数的精度位数 输出

      比如要把123当作十六进制输出:file1<<hex<<123;要把3.1415926以5位精度输出:file1<<setpxecision(5)<<3.1415926。

      2、二进制文件的读写
    ①put()
      put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。

    ②get()
      get()函数比较灵活,有3种常用的重载形式:

      一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。

      另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。

      还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='\n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'\n'。例如:

      file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。

    ③读写数据块
      要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:

        read(unsigned char *buf,int num);
        write(const unsigned char *buf,int num);

      read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。

    例:

        unsigned char str1[]="I Love You";
        int n[5];
        ifstream in("xxx.xxx");
        ofstream out("yyy.yyy");
        out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中
        in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换
        in.close();out.close();

    四、检测EOF
      成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();

    例:  if(in.eof())ShowMessage("已经到达文件尾!");

    五、文件定位
      和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:

        istream &seekg(streamoff offset,seek_dir origin);
        ostream &seekp(streamoff offset,seek_dir origin);

      streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

    ios::beg:  文件开头
    ios::cur:  文件当前位置
    ios::end:  文件结尾
      这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

    例:

         file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节
         file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节


    --------------------------------------------------------------------------------

      有了这些知识,我们就可以完成对文件的操作了,当然,还有好多的成员函数我没介绍,但有这些我们已经能完成大多数的需要了,这种文件操作方式是我比较喜欢的一种方法,比C的方法灵活,又比BCB函数和WINAPI函数具有通用性。

      下一次,我将介绍BCB提供的文件操作的库函数。

     

     在BCB中也提供了文件操作的函数,这些函数的功能和前面所介绍的大致相同,但这类函数和BCB关系紧密,能使用BCB中的AnsiString等数据类型,在BCB中用这种方式的文件操作是最方便的,下面我就把这种文件操作详细介绍。

      在BCB提供的这组文件操作函数中,可分为三种类型,就是:1、文件名函数,2、文件管理函数;3、文件I/O函数。

    1、文件名函数
      文件名函数可以对文件的名称、所在子目录、驱动器和扩展名等进行操作。下表列出这些函数及其功能。

    函数 说明
    ExpandFileName() 返回文件的全路径(含驱动器、路径)
    ExtractFileExt() 从文件名中抽取扩展名
    ExtractFileName() 从文件名中抽取不含路径的文件名
    ExtractFilePath() 从文件名中抽取路径名
    ExtractFileDir() 从文件名中抽取目录名
    ExtractFileDrive() 从文件名中抽取驱动器名
    ChangeFileExt() 改变文件的扩展名
    ExpandUNCFileName() 返回含有网络驱动器的文件全路径
    ExtractRelativePath() 从文件名中抽取相对路径信息
    ExtractShortPathName() 把文件名转化为DOS的8·3格式
    MatchesMask() 检查文件是否与指定的文件名格式匹配

      下面就把这些函数作一一介绍:

    ⑴ExpandFileName()
      原型:extern PACKAGE AnsiString __fastcall ExpandFileName(const AnsiString FileName);

      功能:返回文件的全路径(含驱动器、路径)

      参数:FileName:要处理的文件名

      例:ShowMessage(ExpandFileName(Application->ExeName));//显示你的程序文件名,如C:\MyBCB\Sample1.EXE

    ⑵ExtractFileExt()
      原型:extern PACKAGE AnsiString __fastcall ExtractFileExt(const AnsiString FileName);

      功能:从文件名中抽取扩展名

      参数:FileName:要处理的文件名(全路径)

      例:ShowMessage(ExtractFileExt(Application->ExeName));//显示".exe"

    ⑶ExtractFileName()
      原型:extern PACKAGE AnsiString __fastcall ExtractFileName(const AnsiString FileName);

      功能:从文件名中抽取不含路径的文件名

      参数:FileName:要处理的文件名

      例:ShowMessage(ExtractFileExt("c:\\Winnt\\SOL.EXE"));//显示"SOL.EXE"

    ⑷ExtractFilePath()
      原型:extern PACKAGE AnsiString __fastcall ExtractFilePath(const AnsiString FileName);

      功能:从文件名中抽取路径名

      参数:FileName:要处理的文件名

      例:ShowMessage(ExtractFilePath("Winnt\\SOL.EXE"));//显示"Winnt\"

    ⑸ExtractFileDir()
      原型:extern PACKAGE AnsiString __fastcall ExtractFileDir(const AnsiString FileName);

      功能:从文件名中抽取目录名(和上个函数不同,不包括最后的"\")

      参数:FileName:要处理的文件名

      例:ShowMessage(ExtractFileDir("Winnt\\SOL.EXE"));//显示"Winnt",注意和上个函数的区别

    ⑹ExtractFileDrive()
      原型:extern PACKAGE AnsiString __fastcall ExtractFileDrive(const AnsiString FileName);

      功能:从文件名中抽取驱动器名

      参数:FileName:要处理的文件名

      例:ShowMessage(ExtractFileDrive("c:\\Winnt\\SOL.EXE"));//显示"c:"

    ⑺ChangeFileExt()
      原型:extern PACKAGE System::AnsiString __fastcall ChangeFileExt(const System::AnsiString FileName, const System::AnsiString Extension);

      功能:更改文件名的扩展名,不是对真正的文件进行改名,只是对文件名这个字符串进行处理

      参数:FileName:要改名的文件名,Extension:新的扩展名

      例:ShowMessage(ChangeFileExt("c:\\Winnt\\SOL.EXE",".OOO"));//显示"c:\winnt\SOL.OOO"

    ⑻ExpandUNCFileName()
      原型:extern PACKAGE AnsiString __fastcall ExpandUNCFileName(const AnsiString FileName);

      功能:返回含有网络驱动器的文件全路径,格式为:\\机器名\共享名\文件名

      参数:FileName:要处理的文件名

      例:ShowMessage(ExpandUNCFileName("F:\\Winnt\\SOL.EXE"));/*如果F:是映射的网络驱动器\\NT40\WINNT,则显示"\\NT40\WINNT\SOL.EXE"*/

    ⑼ExtractRelativePath()
      原型:extern PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BaseName, const AnsiString DestName);

      功能:从文件名中抽取相对路径信息,如"..\sss\ss.asd"这种形式

      参数:BaseName:基准文件名;DestName:目标文件名

      例:ShowMessage(ExtractRelativePath("D:\\Source\\c\\1.123","D:\\Source\\Asm\\dz.asm"));/*显示"..\asm\dz.asm"*/

    ⑽ExtractShortPathName()
      原型:extern PACKAGE AnsiString __fastcall ExtractShortPathName(const AnsiString FileName);

      功能:把文件名转换为DOS的8、3格式

      参数:FileName:要处理的文件名

      例:ShowMessage(ExtractShortPathName("E:\\Program Files\\Dual Wheel Mouse\\4dmain.exe"));/*显示"E:\Progra~1\dualwh~1\4dmain.exe"*/

    ⑾MatchesMask()
      原型:extern PACKAGE bool __fastcall MatchesMask(const AnsiString Filename, const AnsiString Mask);

      功能:检查文件是否与指定的文件名格式匹配

      参数:FileName:要处理的文件名;Mask:文件名格式,支持通配符

      例:ShowMessage(MatchesMask("Lxf.exe","*.?x?));//显示"true"


    --------------------------------------------------------------------------------

    2、文件管理函数
      这类函数包括设置和读取驱动器、子目录和文件的有关的各种操作,下表列出这类操作常用的函数及其功能。

    函数 功能
    CreateDir() 创建新的子目录
    DeleteFile() 删除文件
    DirectoryExists() 判断目录是否存在
    DiskFree() 获取磁盘剩余空间
    DiskSize() 获取磁盘容量
    FileExists() 判断文件是否存在
    FileGetAttr() 获取文件属性
    FileGetDate() 获取文件日期
    GetCurrentDir() 获取当前目录
    RemoveDir() 删除目录
    SetCurrentDir() 设置当前目录

      下面就把这些函数作一一介绍:

    ⑴CreateDir()
      原型:extern PACKAGE bool __fastcall CreateDir(const System::AnsiString Dir);

      功能:建立子目录,如果成功返回true,否则返回false

      参数:Dir:要建立的子目录的名字

      例:Create("ASM");//在当前目录下建立一个名为ASM的子目录

    ⑵DeleteFile()
      原型:extern PACKAGE bool __fastcall DeleteFile(const System::AnsiString FileName);

      功能:删除文件,如果成功返回true,否则返回false

      参数:FileName:要删除的文件名

      例:if(OpenDialog1->Execute())DeleteFile(OpenDialog1->FileName);

    ⑶DirectoryExists()
      原型:extern PACKAGE bool __fastcall DirectoryExists(const System:: AnsiString Name);

      功能:检测目录是否存在,如果存在返回true,否则返回false

      参数:Name:要检测的目录名

      例:if(!DirectoryExists("ASM"))CreateDir("ASM");//如果ASM这个目录不存在则创建之

    ⑷DiskFree()
      原型:extern PACKAGE __int64 __fastcall DiskFree(Byte Drive);

      功能:检测磁盘剩余空间,返回值以字节为单位,如果指定的磁盘无效,返回-1

      参数:Drive:磁盘的代号,0表示当前盘, 1=A,2=B,3=C 以此类推

      例:ShowMessage(DiskFree(0));//显示当前盘的剩余空间

    ⑸DiskSize()
      原型:extern PACKAGE __int64 __fastcall DiskSize(Byte Drive);

      功能:检测磁盘容量,返回值以字节为单位,如果指定的磁盘无效,返回-1

      参数:Drive:磁盘的代号,0表示当前盘, 1=A,2=B,3=C 以此类推

      例:ShowMessage(DiskFree(0));//显示当前盘的容量

    ⑹FileExists()
      原型:extern PACKAGE bool __fastcall FileExists(const AnsiString FileName);

      功能:检测文件是否存在,如果存在返回true,否则返回false

      参数:FileName:要检测的文件名

      例:if(FileExists("AAA.ASM"))DeleteFile("AAA.ASM");

    ⑺FileGetAttr()
      原型:extern PACKAGE int __fastcall FileGetAttr(const AnsiString FileName);

      功能:取得文件属性,如果出错返回-1

    返回值如下表,如果返回$00000006表示是一个具有隐含和系统属性的文件(4+2)

    常量 值 含义
    faReadOnly $00000001 只读文件
    faHidden $00000002 隐含文件
    faSysFile $00000004 系统文件
    faVolumeID $00000008 卷标
    faDirectory $00000010 目录
    faArchive $00000020 归档文件

      例:if(FileGetAttr("LLL.TXT")&0x2)ShowMessage("这是一个有隐含属性的文件");

      与此对应的有FileSetAttr() ,请自已查阅帮助系统


    ⑻FileGetDate()
      原型:extern PACKAGE int __fastcall FileGetDate(int Handle);

      功能:返回文件的建立时间到1970-1-1日0时的秒数

      参数:Handle:用FileOpen()打开的文件句柄。

      例:

        int i=FileOpen("C:\\autoexec.bat",fmOpenRead);
        ShowMessage(FileGetDate(i));
        FileClose(i);

      与此对应的有FileSetDate(),请自已查阅帮助系统

    ⑼GetCurrentDir()
      原型:extern PACKAGE AnsiString __fastcall GetCurrentDir();

      功能:取得当前的目录名

      例:ShowMessage(GetCurrentDir());

    ⑽RemoveDir()
      原型:extern PACKAGE bool __fastcall RemoveDir(const AnsiString Dir);

      功能:删除目录,如果成功返回true,否则返回false

      参数:Dir:要删除的目录名

      例:if(DiectoryExists("ASM"))RemoveDir("ASM");

    ⑾SetCurrentDir()
      原型:extern PACKAGE bool __fastcall SetCurrentDir(const AnsiString Dir);

      功能:设置当前目录,如果成功返回true,否则返回false

      参数:Dir:要切换到的目录名

      例:SetCurrentDir("C:\\WINDOWS");


    --------------------------------------------------------------------------------

    3、文件I/O函数
      这类函数完成对文件的读写相关的操作,这种类型的操作和C的基于I/O文件操作类似,下表列出这类操作常用的函数及其功能。

    FileOpen() 打开文件
    FileClose() 关闭文件
    FileRead() 读文件
    FileSeek() 文件定位
    FileWrite() 写文件
    FileCreate() 创建文件

      下面就对这些函数作详细介绍。

    ⑴FileOpen()
      原型:extern PACKAGE int __fastcall FileOpen(const AnsiString FileName, int Mode);

      功能:打开文件,如果成功返回其句柄,否则返回-1

      参数:FileName:要打开的文件名;Mode:打开的方式,取值如下表,可用"或"("|")运算符连接。

    常量 值 说明
    -------------------------------------------------------------
    fmOpenRead 0 以只读属性打开
    fmOpenWrite 1 以只写属性打开
    fmOpenReadWrite 2 以读/写属性打开
    fmShareCompat 0 兼容FCB方式(汇编中有相应的DOS功能调用,感兴趣自已查阅相关资料)
    fmShareExclusive 16 共享方式:以独占方式打开,在关闭以前,别人不能访问
    fmShareDenyWrite 32 共享方式:拒绝写访问
    fmShareDenyRead 48 共享方式:拒绝读访问
    fmShareDenyNone 64 共享方式:无限制,允许读写
      例:int i=FileOpen("C:\\WINDOWS\\Win.ini",fmOpenReadWrite|fmShareExclusive);

    ⑵FileClose()
      原型:extern PACKAGE void __fastcall FileClose(int Handle);

      功能:关闭打开的句柄。

      参数:Handle:要关闭的句柄

      例:FileClose(i);

    ⑶FileRead()
      原型:extern PACKAGE int __fastcall FileRead(int Handle, void *Buffer, int Count);

      功能:读文件,返回实际读取的字节数,句柄必须首先由FileOpen或FileCreate创建。

      参数:Handle:要读取的句柄;Buffer:存放读取的数据的缓冲区;Count:想读取的字节数

      例:char str[400];FileRead(hnd1,str,400);

    ⑷FileSeek()
      原型:extern PACKAGE int __fastcall FileSeek(int Handle, int Offset, int Origin);

      功能:移动文件读取指针,成功返回文件指针的位置,失败返回-1

      参数:Handle:相关联的句柄;Offset:移动的量;Orgin:移动的基准,0=文件头,1=当前位置,2=文件尾。

      例:ShowMessage(FileSeek(hnd1,0,2));//取得文件的长度

    ⑸FileWrite()
      原型:extern PACKAGE int __fastcall FileWrite(int Handle, const void *Buffer, int Count);

      功能:写文件,返回实际写入的字节数,句柄必须首先由FileOpen或FileCreate创建。

      参数:Handle:要写入的句柄;Buffer:存放写入数据的缓冲区;Count:想写入的字节数

      例:char str[]="I Love You";FileWrite(hnd1,str,strlen(str));

    ⑹FileCreate()
      原型:extern PACKAGE int __fastcall FileCreate(const AnsiString FileName);

      功能:创建文件。成功返回其句柄,否则返回-1

      参数:FileName:要创建的文件名

      例:if(!FileExists("KC.C"))hnd1=FileCreate("KC.C");

    August 02

    似水流年

    2008年8月2日,还是写一点东西吧。

    很多微妙的情绪和巨大的改变同样都很难说出口,行诸语言或文字来进行描述。不过,导致巨大改变的,往往是我们内心中最微妙的小情绪。

    那个黑暗中火星儿一闪的瞬间,往往是最快乐的时光。

    July 29

    我的平淡生活

    呵呵,继续我的流水帐啦。
    今天,2008年7月29日,我生命中平淡的一天。
    今天是个阴云密布的日子,浓重的乌云终于战胜了炎炎的酷暑。
    生活一如既往,我的想念自己在慢慢生长 着。
    很快就要回家了,我的生活似乎都因此而充满了温暖的家的味道,那应该是甜丝丝的味道吧爆笑
     
    July 28

    有问必答

    哈哈,被闻和Angel两位大美女点名啦,

    现在开始

     

    A.被点到名字的要在自己的博客里写下自己的答案,然后去掉一个你最不喜欢的问题再加上一个你的问题,仍然组成20个问题,传给其他至少3个人,列出需要回答问题的人的名字,还要到这些人的博客里留言通知对方你被点名了,被点名者不得拒绝回答问题,完成游戏的人将会永远得到大家的祝福。

    B.
    这些人要在自己的博客里注明是从哪里接到的,并且再传给其它至少3个人,让游戏继续下去,不得回传,被点到名字的人将会得到大家的祝福,并且所有美好的愿望都会在不久的将来实现。嘿嘿, 是要做这个游戏喔, 那么开始回答问题吧。


    1.
    有生以来,你最不想忘记的一件事是什么?

    要成为一个正直而有价值的人

     

    2.如果有很多钱,想怎么花? 
    在世界各地开小店

     
    3.你最希望从朋友(不包括爱人)那里得到的是什么?

    信任,理解,支持,鼓励倾听

     

    4.最近最郁闷的事
    订回国机票

    5.最受不了自己的哪个缺点

    情绪化


    6.认为自己做的最正确的事 

     

    坚持做原原本本的自己


    7.遇到喜欢的人,你是勇敢表白还是默默关注?

    默默关注, 我没有信心表白

     

    8.你生命中最重要,最想珍惜的是什么?

    亲情,友情和善良的本性 

     

    9.说出点你名的人的3个优点(不可删除题) 
    独立,真诚,美丽

     
    10.最想达成的职业梦想 
    系统架构师

     
    11.什么样的人会让你视为知己?

    独立,善良,正直,敏锐,大方 


    12.30岁对你将意味着什么? 
    该考虑结婚了


    13.爱人和被人爱,哪一种更幸福?

    爱人


    14.你现在最想拥有的什么?

    和家人在一起的时间

     

    15.如果现在没有男女朋友,会选择相亲吗?

    不会


    16.最希望和爱人在哪里生活一辈子?

     

    爱人最喜欢的地方

     
    17.唐僧师徒四人,希望自己是哪个人物

    唐僧

    18.
    失意的时候想干嘛?

    旅行,购物


    19.做过最内疚的一件事?

     很多事自己没有尽力

     

    20.爱上不该爱的人怎么办?

    继续默默地爱吧,直到爱上该爱的人

     

    改题: 将4最近最郁闷的事?改为 “最想完成的生活梦想是什么?” 

    下面开始点名:

    qian,小宝,伤逝,Fantasy,ヘイ兆愛

    July 26

    我的平淡生活

    2008年7月26日、东京时间18点51分、又是一个周末了,虽然是酷暑难耐的夏日,时间的脚步却依旧转瞬即逝。
     
    这一周过的很不平淡、因为在工作中遇到了各种挑战,承受了压力,也enjoy了小小成功的喜悦。
    虽然我已经习以为常了,但还是想感慨一下关于生活与工作的种种意义吧スマイル
     
    选择来日本工作,就意味着做好了接受各种考验的心理准备吧。在这里,我切身体验了纯粹的现代模式的职业生活。
    在这里,遇到了许多的优秀而又Professional的行业精英,开始不断的改变自己,因为这里是我的起点。
    现在的我对工作开始有了另一番见解,也慢慢开始会留一个心眼,观察身边的人是如何展现Professional的一面。
    一个人的优秀,不应该只体现在这个人本身,当他有本领,有一种影响力,让身边的人惭愧,并且因此而努力的时候,才不愧为精英两字吧。
     
    其实每个人做事都有自己的底线,有些人觉得做到80分不够,那么100分达不到的话至少要95分。
    在日本工作,感觉每个人的底线似乎是做到95分还不够,大家都是极端的完美主义者,都在努力为自身增值。
    其实,现在我对压力的理解变得很模糊,也许这只是一种个人所追逐 的生存价值观吧。
    任何人在面对真实的生存压力之后,心态一定会变得平和,没有愤怒和悲伤.这种平和本身才是最实用的生存 哲学。
    我的人生还只是 一张刚刚开始描画的白纸,我做不到100分,但是我愿意尽力做到100分。
     
    现在,开始慢慢明白,很多时候,我们需要把自己尖锐的心沉淀下来,就会豁然开朗。
    当然,,心平气和并不意味着要放弃激情。
    我一直认为没有激情的努力是绝对没有光彩的,也许你还不赖,但绝不会出类拔萃。
    生活是需要激情的.ウインク
     
    我是个非常普通的女生,也不聪明。
    从毕业到现在,这一路走的很顺畅 ,以至于我觉得不真实.
    唯一觉得真实的收获就:如既往地、真诚的面对生活和工作,不计较,不抱怨,坚持,不放弃自己最初的执著。
    当然呢,上班偶尔也会无聊,也会充满各种挑战。
    但是解决疑难,超越自己瞬间的那一刻,难以言表的喜悦,生命似乎也因此而栩栩生辉。
    那一刻,我可以证明自己是为此而存在着的.スマイル
     
    呵呵,今天就写到这里啦ペロリ
    July 22

    生活纪实录之

    今天的生活一如既往,2008年7月22日,一个普通的夏天,一个平凡的女孩子和她的那段平淡而精彩的生活。
    这个清晨,6点准时起床,因为不忍心这么美妙的清晨在睡梦中度过,不忍心时光悄悄地从指尖溜走ペロリ
    很悠闲的吃着早餐,最后依旧是拎着包奔跑在楼梯间,冲向自己的鞋柜,慌乱的换上鞋,跑步到二楼。
    呵呵,一个很难优雅起来的女生啊
    中午,最后才去吃午饭,因为早上又开了2个小时的例会,我的计划再次被打乱,呵呵,也许该庆幸可以名正言顺的偷懒啦
    下午,一切进展顺利,看来有望在明天结束溶接线强度测试模块的第一部分,呵呵
    晚上,6点半回家,居然收到了意外的礼物,很开心啦スマイル
    今天,就写到这啦
     
     
    July 21

    三连休纪实

    现在呢,东京时间17点31分,2008年7月21日----今天是一个特别的日子,海の日。也是三连休的最后一天啦,现在呢,就回顾一下这三天的些许片断吧ペロリ
    7月19号的早上呢,7点起床,炎炎夏日刺目的阳光透过窗帘直射进来,即使空调温度开得很低,依然让我觉得夏天真是势不可挡。
    劳动1个小时,把公寓里每个房间的地板都擦了一遍,嘻嘻,很勤快吧スマイル
    接着呢,我又开始选这周的战场啦,其实呢,就是把自己的本本和小沙发从这个屋搬到那个屋,呵呵,这也许就是一个人住一套公寓的唯一乐趣吧。
    我觉得自己是一个不怕寂寞,但却惧怕生活一成不变的人啦。所以呢,即便是自己一个人,每天来回穿越在几个房间里,让我觉得自己的生活过的很热闹,没有静止。
    这也许是别人很难体会得到的一种快乐吧,呵呵
    有时候,觉得生活才是一场最真实的游戏,没有剧本,没有彩排,不允许倒带,演员是自己。有些时候,甚至连观众也只是自己。即使那样,还是要演得有声有色。
    上午10点,我出门了,去了图书馆还书,然后呢,在那里边一直晃荡着,终于找到了自己要的小说,很开心哦
    下午三点左右呢,去happytown看看有没有爸爸要的东西,时间在不知不觉地溜走啦。
    出来的时候,居然是大雨磅礴,很多人都在等着,唉呀,太粗心了又没带伞,只好等了。。。看着大雨没有丝毫停下来的意向,只好冒着雨回来了。
    嘻嘻,其实呢,走在大雨下的感觉很好啦,可以肆无忌惮的踩小水坑,一个接着一个的踩,呵呵ペロリ
    衣服啊,鞋啊,全湿透了,自己当然也是面目全非啦,不过,没关系的,也算是平淡生活中的一次历险记吧
     
    7月20号呢,白天没有出去,躲在家里避暑了,看小说,上网。
    7月21号呢,也就是今天啦,早上出去跑步了,呵呵,其实自己住的周围环境真不错。
    下午呢,处理一些杂务,不知不觉的就到了现在,现在呢,东京时间18点45分。
    站在凉台上,看外边依旧是风景宜人,夕阳的余晖将天边的薄云染上了淡淡的色彩,天空不是那么纯净的蓝,总有些许的云朵在若隐若现着,
    很多的绿树的影子在重叠着,似乎还有鸟鸣声吧。
    我不禁意的联想到了那样的一幅画面,夕阳西斜,炊烟袅袅,慈祥的母亲在山间呼唤着孩子的名字,回音在山间回旋。。。
    那个孩子是我就太好啦,哈哈
    在现在的时代生活着,太多新鲜的事物出现在我们的视野中,依旧觉得缺少了一样重要的东西。
    如果真的有时空隧道,我愿意回到那个淳朴 的时代去感受一下曾经,所谓的生活的源与本。
     
    July 18

    周五 纪实

     现在是东京时间18点40分,2008年7月18日 ,我生命中的一天,这一天的阳光异常刺眼,空气中无不散发着夏天的味道。
    我 5点半准时下班,难得的周五的晚上啊,结束了一周的工作,该好好过过自己的周末啦ペロリ
    回家的路上,去happytown买了自己最爱吃的巧克力,雪糕,还有水果,满载而归啦。
    回家就开始整理冰箱,开空调,开笔记本,开电视,开洗衣机,终于全部搞定啦,呵呵
    一开msn,就遇到了xq,嘿嘿,没想到此时此刻的厦门正是大雨滂沱啊,那个家伙  还在坚持不懈将我们的减肥计划进行着,去海边跑步,浪漫而有情调啊。
    一直以来,都觉得xq是我认识的最  有情调的女生。既有很好的文化底蕴,又温柔细腻,成熟而含蓄。。。嘻嘻,反正是很好很好的啦,祝福她早日找到她的克罗斯啦,哈哈
    先写到这里啦スマイル
     
    July 16

    因为我是天蝎座***

    天蝎座分析 ウインク
    一、天蝎不喜欢浮华的爱情,只想平淡地爱,但要刻骨铭心。 
    二、天蝎有时的想法很极端.
    三、天蝎不喜欢争吵,大多数情况下会用沉默来代替内心的不良情绪。但若遇到十分气恼的情况,他/她会发威,结果是口不择言,不用费劲地说世界上最恶毒的语言说出来给对方听,中伤对方。心里却在想:你不要以为是我脾气好,你就可以任意摆布我,挑衅我的脾气。等天蝎都说完了,心里的气非但没消,反而更大了,这一点可能大多数人都觉得想不通。恋人可能会被骂得狗血喷头,但过不了两天,天蝎自己会主动反省,为自己的言语感到失态和后悔。 
    五、天蝎怕孤独,对于感情也十分敏感,对方的一个小小的动作或眼神,他们都会看在眼里记在心里,接下来的事情就是天蝎开始猜想对方的心思了,猜来猜去,是为了让对方感觉到自己的用心良苦和自己对恋人深刻的爱。 
    六、天蝎不喜欢向恋人说出自己的一些想法,因为害羞或是别的什么原因,天蝎自己也说不好。他们更喜欢或是希望对方能猜出他们的心思来,只可惜对方不是每次都能那么幸运地猜中并付出行动,若对方没有能猜中天蝎的想法,天蝎便会对恋人很失望,觉得恋人不了解自己。
    七、天蝎座的人有一点刘若英为爱痴狂里的那种人的特点,对待爱情是傻傻的,直直的。还会有个很可笑的想法:认为自己能给对方最好的爱最多的爱,对方很幸运;同时对方也会是世界上最幸福的那个人,对方应该会很满足。 
    八、天蝎的他/她很希望能和对方有默契,达到共识。于是便会做一些近乎讨好对方的事情,但这并不能算是卑微,哪怕最后只得来对方一个甜甜的笑,对于他们来说,就是一种莫大的满足和成就。 
    九、天蝎平常的脾气是典型的外冷内热,但能被他们热到的人并不多,越是天蝎表面对你很热情的话,那大都能证明一点,他/她对你没有太大的兴趣。反之,表面上对你带搭不理,其实内心已经在向你靠近了,当然也不是每次都是这样,这就要看你的眼力了。
    十、不得不讲的是,天蝎座的人有时有些神精质,自愚的能力也挺强。从他们嘴里可以不太困难地听到一些奇怪的话,他们不以为然,也不会理会恋人听到这些话之后的反应。 
    十一、天蝎的人很怕自己身边有亲密关系人的否定,比如家人恋人对他们的一些指责或是批评,并不是天蝎不勇于承认错误,而是他们认为连自己身边的人都不信任自己.
    十三、天蝎爱起来就像火山爆发,恨起来就像冰山一角。
    十四、天蝎天生就有一种保护人的欲望,
    十五、天蝎很少会对人说:求这个字。因为他们觉得求人不好,好像会影响自己的形象,所以宁可这件事不做了,也不会轻易开口向别人求助,他们只是不想欠别人的。 
    十六、天蝎有些自我折磨的倾向,一旦失恋之后,便会多日走不出失恋的阴影。内心渴望着对方能回心转意,当然是在对方先提出分手的情况下,虽然如此,倘若真的对方有所回头,天蝎又会因为那骨子里天生的冷酷而断然拒绝对方。很矛盾吧? 

    十七、天蝎在一些事情上是有预感的,即使有些事恋人没有如实地讲出来,天蝎的他/她却早已了解实情,但却不会当面揭穿恋人,内心还会有些得意,认为对方的小伎俩小想法早已尽在自己的掌握之中。 
    十八、天蝎在和恋人在一起时,就会变得很傻,傻到好像世界是静止的一样,他/她可能不会考虑任何现实中会发生的事情,以及周围人对他们的看法。
    十九、当天蝎和自己的恋人闹别扭时,开始的时候他们会很坚决,大有一种决不首先向对方妥协的势气。这一点对于已经熟悉他们的恋人来说,早已习以为常了。聪明的另一半都会等着天蝎自己把气儿消了,便会主动送上门来,呵呵!(作为天蝎也够惨的)可是莫名其妙地即使是对方做的不对,时间一久,天蝎就开始想对方的好了,什么对方的体贴啦,关心啦,温柔啦……等。于是自己主动找上门和恋人和好如初就像什么都没有发生过。 二十、天蝎座有时会宠坏了恋人,即使一个天蝎的女生也会像个“男生”一样宠着自己的恋人,恋人的一些要求会尽量地满足,哪怕是有一些小过份的。为恋人做了一些事之后,他们还会反问自己:“我这样是不是对他/她太好了?”可是下次遇到同样的情况,却还是会那样去做,宠着恋人,做一切能为他做事。 

    二十一、天蝎MM不喜欢在男人面前示弱,即使这件事本该男人来做,但当她们看到自己的男人在做事的时候不足够利落和潇洒时,她们便会忍不住去揽下来,自己做。说白了,她们不愿意相信自己挑选的男人是这样地“不优秀”,但这丝毫不代表她们不再爱他以他失望,相反地她们会更加爱这样的一个男人,因为他们需要她。这逻辑估计会激起不少男人的反感……正是因为这一点,会得罪不少男人的自尊。天蝎的MM的确不是很温柔很小鸟依人的那一种。 

    二十二、天蝎对恋人正面的批评很反感,甚至是恼怒。尽管他们自己知道自己做的不妥,有缺点。并不是不愿意听恋人的劝告,因为那些批评的语言会让他们觉得对方是在羞辱自己,这一点天蝎是决不接受的!如果对方以一种开玩笑的语气讲他们的缺点,他们会更乐意接受并且在内心感激恋人的包容。 

    二十三、天蝎女生表面坚强,嘴巴硬,说话狠。其实内心很容易受到伤害。当自己的恋人做了让她们很难过的事,她们不到一定时候是决不会主动跟恋人说起的,只是心里默默地难过,感觉自己像个受伤的,却勇敢站在人群中的雕像一样,漠然地看着身边那些恋人们的甜蜜欢笑。这时的天蝎说话比平常少得多,周围的人都会以为是不是天蝎又被人惹怒了,所以都躲得远远的怕引火上身,其实她只是受伤了,没有心情再像平时那样和周围的人谈笑风声而已。 

    二十四、当发现周围的人都躲着天蝎的时候,天蝎们也觉得很好笑,为什么大家会离自己远远的。其实说白了,是天蝎的脾气不好,可能有的人还会认为天蝎是个怪人,有点喜怒无常的感觉,这一点虽然不及巨蟹那么明显。
    二十五、天蝎的同性朋友并不是很多,因为他们对朋友的定义好像有点严格了,那种酒肉朋友他们是决不看在眼里的,就算表面上和你有说有笑,内心却厌恶得要死。他们当然能很清楚地知道自己需要什么样的人来做朋友,只有那些有信誉够义气很少玩嘴的人,才会让天蝎放下心来和他们做交心的朋友。顺便说一句:天蝎对自己的朋友是很好的,自己吃一些亏也无所谓,只要朋友能在他们需要的时候陪他们聊聊就足够。对于朋友的一些事情,他们也会当做是自己的事情一样,热心去帮助对方。如果你身边有一个天蝎的好朋友的话,应该是比较幸福的哦! 

    二十六、再说说天蝎的异性朋友吧,在没有正式的男友或女友之前,天蝎的异性朋友还是不少的。因为他们觉得那是一种象征,象征自己是惹人喜爱的,哈哈。这句话有点儿过头!至于要不要发展成为男/女友,他们倒是几乎每个人都想过,不是花心,而是天蝎天生爱瞎想,想像一下和某某人如果在一起会怎样对于他们来说是件很有趣的事,但只是想像,很少会主动行动。天蝎的异性朋友也喜欢和他们在一起,因为这样的朋友之间男女的性别界限并不是很明显,他们可以在一起像好弟兄一样。 

    二十七、一旦天蝎有了男/女友,原本很好的异性朋友关系就变了。天蝎会很有分寸地和他们来往,决不轻易越限。相反,如果天蝎的异性朋友有了他们的男/女友,天蝎一样会保持距离的和好友们来往。甚至有时还会有点伤心,觉得自己的异性朋友有男/女友了,自己便少了个很好的“弟兄”。虽然如此,天蝎们却很真诚地希望朋友能得到自己的幸福。 
    二十八、恋人之间在要分手的那段时间,经常会打电话不接发短信不回之类的。天蝎对于这样一种状况是非常恼怒的。他们认为就算要分开恋人也犯不着躲着自己。对方越是没反应,天蝎越是说一些恶毒的话来中伤或是讽刺恋人,以此来抒发内心的愤怒。
    二十九、在天蝎刚认识一个新的恋人之后,天蝎的行动便开始了。天生的007才能会在这绝好的机会上发挥一番,背着恋人查查他/她的底细,其实也不是什么别的,只是天蝎想搞清楚新恋人对自己说的那些情况是不是真的,自己有没有被骗。有点儿阴险哦。即使发现了对方的有意隐瞒或欺骗,天蝎并不会当时就揭发出来,而是一步步地看着对方露出马脚,不能自圆其说。到那时候,天蝎再冷冷地说一句:别装了,你在想什么我早就知道了!然后扬长而去……虽然天蝎也许会有些生气,但因为最终当面揭穿了对方的谎言,那是会让天蝎很有成就感的!在内心永远都会鄙视那个欺骗自己的人。所以,友情提醒一句:千万别骗天蝎,一旦被发现,会面子扫地的其实天蝎只是很专情, 不许对方骗他们感情而已。天蝎把自己对恋人的感情看得很重的。一旦投入便是全心付出,深深爱着。  
    三十、天蝎喜欢占卜,什么星座啦属相啦,他们都比较关心。对于一个刚认识不久的恋人来说,天蝎们会很有兴志地查看关于星座配对啊,属相相和啊之类的东西,他们在查那些东西的同时,其实只是为了想证明一点:自己的选择是正确的,看到两人相配的文章,天蝎心里那就甭提多美了,就像喝了一杯酒之后的感觉,一个字:爽。如果碰到说两人不合的情况,天蝎会在心里告诉自己:这都是瞎说的!唉!蝎蝎啊,在这一点上真是有些自欺欺人。 

    骨子里天蝎是想看透每一个人的,所以总会对这些东西感兴趣。至于自己的恋人,天蝎会像课题一样好好研究的,目的只有一个:怎样才能更好地爱他/她。 

    三十一、天蝎对于结婚这件事,是有顾虑的。他们也许会和某人认识不到一周便闪电似的结婚,但并不代表他们对恋人不挑剔。天蝎对恋人的了解是很有趣的。他们有一段时间只对恋人的某一方面进行了解甚至着迷。等过了这段时间,蝎蝎们不会闲着,会急着去寻找恋人身上其他的方面,有时还会想:这个人不可能没有缺点,我一定要发现它并且帮他/她改掉。 

    好好珍惜蝎蝎吧,他们的爱大多不掺杂质,纯纯的,傻傻的。直到你做了太多太多伤害到他/她,让他/她失望的事情,他们才会不舍地离去。 

    三十二、天蝎是害羞的,在公众场合总不太喜欢与恋人有太份亲密的动作,他/她会觉得有失大雅.

    三十三、女蝎蝎理解的世界上的男人应该是个顶天立地、勇敢、讲诚信的硬汉,但也要适时地懂得情调之类。这要求是不是有些高?嘿嘿。但往往现实中天蝎没有那么地幸运遇到这样的男人。若遇到了女性化或是做事狭隘的男人,天蝎会把毫不留情地把他看扁的,然后痛骂一顿转身就走。 

    看透不说透应该是天蝎另一半的明智之举,但前提是:你一定要看得透!蝎蝎说话做事喜欢拐弯儿,如果蝎蝎的一些做法说法,你并没有理解其用意的话,那么蝎蝎对你可就失望至极了。 

    三十四、综上所述,要做好一个天蝎的恋人,还是很不容易滴~~~(因为天蝎对恋人的要求有点儿高)同理,若你已成为了天蝎的恋人,也证明你是非常优秀滴,至少在天蝎的眼里。
    三十五、天蝎骨子里有伤感的成份,所以在遇到像这样的雨天,他们的心里就会“触景生情”,变得很温柔。如果是一个人呆着,也许会发呆想自己以前的恋人或感情,或是思念现在的恋人。若是两个人在一起的话,蝎蝎的柔情可能会表现得比较好。(实话的说,蝎蝎们平时并不是很柔情) 

    蝎蝎是喜欢浪漫气氛的,当然有他们自己的方式,比如俩个人静静地抱着看外面的雨滴;打着伞在街上踩水等。这些都是外人觉得很无聊的事情,但在蝎蝎看来是无比美好的。可能因为雨天气压的问题,俩个人在打一把伞的时候说话的声音会比较清晰和动听!如果你爱上了天蝎,那么也许这是个绝好的机会表达爱意哦!嘿嘿。 

    三十六、蝎蝎的醋意是蛮足的,所以千万不要在这方面故意挑衅他们的忍受力,他们会很恼火的。比如在街上跟蝎蝎讲:某某女生很漂亮……某某男很有男人味很有风度等。蝎蝎会很伤心,为什么你所感觉的这些人中没有他们,然后接下来你说的话他们可能就没心听了,开始自己闷着胡思乱想:难道是自己对恋人还不够好吗?或者恋人根本就不懂得自己对他/她的爱?对自己的爱视而不见?想着想着事情就出来了。蝎蝎可能会突然变得心不在焉,心里觉得恋人真是没心没肺,于是便会莫名其妙地发脾气把恋人吓一跳,更有一些恋人到这时还不明白为什么蝎蝎突然这样?如果别的星座有爱吃醋的人的话,那么蝎蝎能算得上是醋厂了,随时随地可能吃醋,即使是恋人有意的一些玩笑也会让他们难过好久的。所以,请蝎蝎的恋人注意哦,可别闲得无聊就说话让蝎蝎吃醋,时间久了,蝎蝎会伤心至极突然转变的,到那时就什么都晚了。 

    三十七、天蝎有时会口是心非,虽然其实星座的人也会这样,但天蝎……是那种不被理解的口是心非型。比如:小时候家人主动要为蝎蝎们买个玩具啊,糖果啊之类的,蝎蝎们明明心里想要,也会嘴上不承认。如果家人明白给他们买了的话,他们会很开心,但如果家人不买了,蝎蝎们又会自己偷偷难过好久。这逻辑是不是很反常啊?天蝎在和恋人一起时也一样会做出一些自己都说不清楚的事来,比如:明明想让恋人陪自己去某某地方,如果是恋人先主动提出要陪自己去的话,却因为出于对恋人的“爱护”,蝎蝎反而会说:不用了我自己去就行。恋人真的不陪蝎蝎了,于是……蝎蝎又开始自怜甚至伤心,为什么自己说不用恋人就真的不陪了?晕啊~~~~超级晕的蝎蝎。这就是蝎子,爱让别人猜心思的蝎子,口是心非! 

    三十八、蝎MM和蝎GG骨子里是争强好胜的,比如在路上和别人“飙车”的,八成是天蝎。他们总是不服气为什么别人会轻易地超出自己,(尽管有时骑的是自行车!)这一点也很古怪。如果遇到蝎蝎生气的时候,那你就更不要和他们比了,比不过的。而且越是在恋人面前,越是要表现得自己很“强”,哪怕是蝎MM他们自己都说不清楚干嘛要这么做。(个人认为蝎MM的确不是很温柔) 

    三十九、蝎蝎的心很软,比如:和恋人闹别扭了,不管是谁的错,只要恋人主动回头只要不是原则上的事,用不了几名“甜言蜜语”蝎蝎就软了,立马和恋人又腻在一起,好像什么都没发生过一样,虽然有时对方并不这么认为。心太软,KANONO说的没错,蝎蝎是壳硬芯软的,嘿嘿! 

    四十、蝎蝎的耐性是不好的。虽然网上有好多关于蝎蝎坚韧的说话,若是让蝎蝎面对一个又哭又闹的小孩,他们多半是会疯的。刚开始蝎蝎还会相对温和地对待并且不断提醒自己:要温柔要有耐心,若不见效果,那么便会是一顿发作,连吵带打武力解决!其实是事得其反的。要么蝎蝎就会在小BABY哭的时候躲得远远的,不是不爱他们,而是真的受不住。  

     

    生活流水帐之二

    今天是2008年7月16日,我生命中很平淡,也很开心的一天。
    和往日唯一 不同的是,开发组的大leader杉本融俊去东京出差了,只好由小leade千葉裕治管着大家,工作节奏真是不紧不慢啊ペロリ
    今天下班回家,走在路上看到一个年轻的妈妈带着两个胖乎乎的小男孩,还有一只布熊狗*(哈哈,其实我也不知道那叫什么狗啦,很像玩具布熊哦*,在散步 ,还笑着和我打招呼了呢,嘻嘻。
     
    觉得早点结婚也很好啊,呵呵,爸爸妈妈也是26岁结婚,然后27岁就生下了这么健康可爱的我啦ウインク,很自恋哦
    忍不住回想起大一 的时候住在五舍126,第一次睡上铺,哈哈,老怕自己摔下来,最后是自己倒真没摔,就是书啊,毛绒熊啊,各种 小东西争先恐后的往下掉啊,当时可真是狼狈不堪阿恥ずかしい
    记得当时大家还说,像我这样的,将来要有了小宝宝,什么时候从床上掉了,我肯定是 到了最后 都发现不了的那个大头虾,哈哈恥ずかしい
     
    日本的梅雨期很快要到了,呵呵,今年明显比去年热啊,很期待下雨的季节哦
    今天就这么过去啦
     
    July 15

    生活流水涨

    今天像往常一样平淡,为了 自己变成老奶奶的时候,有故事可以翻阅,我还是 想记下这些琐碎的片断,哈哈ペロリ
    清晨六点半准时起床,七点开始享受我的美味早餐,7点半开始看早间新闻,八点8分出门上班,今天 的阳光很明亮,清晨的空气 异常的清新,拎着包走在上班的路上,心情很好ウインク
    到了公司,先去一楼换了鞋,再接着就进了2楼的开发室,嘻嘻,恰好遇到我们组的一位 日本mm,一起进去啦。呵呵,唯一证实了一点,每天上班来的最晚,走的最早的都是女生恥ずかしい
    自从 最近换了新的显示器和键盘,工作的热情也是大有提高哦,鼓励一下啦。
    不到八点半*(8点28分,就收到了开发组`LEADER的mail,9点开例会,嘻嘻,可以偷懒一下啦スマイル
    9点的时候,开发组最帅的日本男生小坂亮,告诉我去会议室开会了,哈哈,被帅哥叫还是蛮开心的啦。
    开会的内容呢,又是为了制造世界第一流的汽车而必须开发世界第一流的software这类的开发要求,总之就是更多的规则和注意事项,更高的要求,必须万无一失,品质卓越的开发。
    看那个开发部长,不愧是日本的技术精英,说话口气经常就是站在世界第一流 的 角度来衡量现在的工作,成为那样的牛人,得却是需要技术经验和资本的,我很佩服 阿,让自己也对工作多了一种成就感,呵呵スマイル
    那个会议持续到了将近11点,一个上午就这么过去了,自己就开工了那么一小会儿ペロリ
    下午总算是解决了这个月开发的一些疑难问题,值得小小庆祝一下啦
    晚上,我站在阳台上,边吃雪糕,边看着夕阳西渐,想到一个月后就可以见到爸爸妈妈,弟弟,姥姥,旦旦,扬扬,杉杉,还有双胞胎 ,好多好多的人,我觉得太开心啦。
    嘻嘻,今天就差不多这些啦。
     
     
    July 13

    周末清晨随笔

    最近很久没来这里了,文字存在的意义度我来说,那就是让一些东西可以从内心流淌而出,每个人都有自己的方式。
     
    最近的工作很顺利,我做的两个模块,终于以0bug的状态顺利纳品了,呵呵,骄傲一下啦,c的开发实在是比较具有挑战性,最基本的要求一定要思维缜密,疏而不漏。
    经过这一年多的磨炼,自己也在不断的成长着,然而在这个领域,自己还依旧是个初学者,现在唯一可以做的就是不骄躁,不自大,脚踏实地的学习,向身边的每个人学习,向书本学习。
     
    现在的我,再过3个多月就25岁了,也许该要收起那份心高气傲,那份年少轻狂,多些冷静和从容,多些宽容和成熟。
    25岁的我,必须要明白在一个人的生命中,努力的方向永远要比努力的对象重要很多倍。
    25岁的我,必须要很理智的明白,有些不属于自己的东西要很潇洒的放弃,生活嘛,就是有得有失。
     
    最近的生活也很不错 ,每天晚上10点半就睡着了,可以在翌日的清晨早起看到最明媚的阳光,呼吸到最清新的空气,准备最丰盛的早餐,然后精力充沛的开始 一天的新工作。
     
    深夜似乎是一个人情绪最失落的时候,容易胡思乱想,过度悲观,深夜写的文字似乎也充满了无尽的悲凉与颓废。
    现在,我觉得自己没有任何理由去悲观和颓废吧,如果有,那就是自己在无病呻吟啦,我讨厌那样的自己号泣
    呵呵,加油哦スマイル
     
     
    June 22

    那一刻

    就像有一天,海水终将冲走冲走一切
     
    我依然愿意带着一箱冬装,准备去寒带寻找些什么
     
    我自己可以证明,那一刻我为此而存在着
     
     
     
     
     
     
     
    June 15

    写在父亲节的那一天

    今天是父亲节啦,祝老爸节日快乐哦爆笑
     
    最近工作及其的不繁忙,呵呵,我每天 过的 都很腐败阿ペロリ 
    闲来没事的时候,看了好多电影,我的内心被触动了,被各种超越了生命的精神的力量所震撼着。
     
    《Talk to Her 》------伤逝极力推荐的阿莫多瓦的作品,阿莫多瓦---西班牙电影不倒的旗帜,《关于我母亲的一切》这部片很多人都不会陌生。
    《Talk to Her 》-----讲述了一个关于友谊,寂寞,生存,谈话和爱情的故事,两个男人竭尽心力照顾两个女人的漫长过程。就像很多影评中所描述的,在一步步走进阿莫多瓦影片的同时,人们也越来越感到,恐怕我们永远都无法走进他的内心世界并接受他的思维方式。也许这也正是阿式电影一种独特的魅力所在吧。
     
    《北极圈恋人 》-----在北极圈内,有午夜的阳光,太阳似乎永远不会下沉……然而奇迹还会再次发生吗?在每个人的 生命中,总会有某个缺角,而命运就在转角处伺服,谁也无法预料下一刻。所以---直到最后,女主角Ana想奔跑着回到过去,回到几小时,几分钟,甚至几秒钟之前,最亲爱的人还未消失的时候。这部片延续了密谭*( (Julio Medem )一贯的带有迷幻色彩的爱情片风格,喜欢里面的音乐,静谧的钢琴曲 喜欢哀婉凄美的画面,男女主角的眼神美的让人心痛。。。。
     
    很久了,自己似乎都不曾被感动了,自己似乎也变得平庸而没有了精神追求,像许许多多的人一样,融入了现实,变得患得患失,变得在乎别人的评价,变得为很小的 事情劳心费神 。
    然而,人的生命还应该有一种比适应现实更加强大的 韧性ペロリ爆笑
     
     
     
     
     
     
     
     
     
     
    May 18

    2

    我听见年轻的藤蔓生长

     我听见棕榈树的低低的气息

     我的小屋周围

     树枝醒着

     蓝色香子兰没有睡觉

     天空把它巨大的耳朵

     贴在大地上

     等着倾听你的来临

         ——伊凡·哥尔