注册 |登录

0GiNr技术社区论坛系统常规开发Infoheader - VB 基础学 C++ 专区 › 查看主题

2977

查看

2

回复
返回列表

版主

菜鸟

Rank: 7Rank: 7Rank: 7

金钱
110101 元 
经验
11403 点 
威望
10 点 
贡献
52 点 
精华
10 
go

VB基础学C++(8)——文件与预处理

1
发表于 2008-7-5 19:57 | 只看该作者 | 倒序看帖 | 打印
凡本论坛原创内容,其作者享有著作权,未经许可谢绝转载。
一、预处理

所谓预处理,就是在编译(c++要编译之后才能执行,不像VB是立即执行的)之前所做的处理。

1、宏定义命令
#define,相当于一个替换,例如:
[cpp]#define WIDTH 80[/cpp]
句末没有分号,中间用空格或者制表符隔开。这样在程序中的“WIDTH”就会被80代替。注意这个WIDTH不包含字串中的“WIDTH”,也不包括例如MYWIDTH中的“WIDTH”。
宏定义实际上还可以带参数,比如:
[cpp]#define MAX(a,b) ((a)>(b)?(a):(b))[/cpp]
其中(a,b)叫作宏MAX的参数表。如果程序中出现:
[cpp]x=MAX(3,9);[/cpp]
那么预处理后会变成:
[cpp]x=(3>9?3:9);[/cpp]
这相当于一个函数,但是比函数要简捷。

2、文件包含命令
#include <文件名>
#include "文件名"
文件名一般是以.h作为扩展名,称为“头文件”。“<>”表示文件由系统提供并保存在指定目录中;“""”表示文件是用户自己定义的。

3、条件编译命令
希望根据一定的条件编译文件不同的部分,需要用到条件编译。
(1)
[cpp]#ifdef <标识符>
        <程序段1>
[#else
        <程序段2>]
#endif[/cpp]
标识符如果被#define定义国,则编译程序段1,否则编译程序段2。这里#define后面只跟标识符即可。
(2)
[cpp]#ifndef <标识符>
        <程序段1>
[#else
        <程序段2>]
#endif[/cpp]
和(1)区别就在于“n”上,即没有定义标识符则编译程序段1,否则编译程序段2。
(3)
[cpp]#if <表达式1>
        <程序段1>
[#elif <表达式2>
        <程序段2>
        ...]
[#else
        <程序段3>]
#endif[/cpp]
很好理解,不再举例。

二、文件概述

1、文件的打开和关闭
文件的打开和关闭是通过使用fstream类的成员函数open和close实现的。
fstream类的头文件是fstream.h。
函数原型:
void open(const char* name, int mode, int prot=filebuf::openprot);
void close();
函数open中,name指定要打开的文件名,包括路径和扩展名。mode指定文件的访问方式,包括只读、只写、可读可写、二进制文件方式等。下面列表给出了可以使用的访问方式。参数port是用来指定文件的共享方式,缺省的filebuf::openport表示DOS兼容的方式。
fstream的文件访问方式
ios::app                打开一个文件使内容添加在文件的末尾
ios::ate                打开一个文件使内容添加在文件的末尾,但是下一次添加时,却在当前位置处进行。
ios::in                为读打开一个文件,若文件存在,不清除文件原有内容
ios::out                为写打开一个文件
ios::trunc                若文件存在,消除原有内容。通常和ios::out,ios::ate,ios::app,ios::in进行“|”(按位或)组合。
ios::nocreate        打开一个原有文件,若不存在则打开失败
ios::noreplace        若文件存在,则打开失败
ios::binary        二进制文件方式(缺省是文本方式)。通常与上面方式进行“|”(按位或)组合。

2、文件的读写
读出数据:get、getline、read、>>
写入数据:put、write、<<
相关函数:
get(char &ch);                                                        读取一个字符
getline(char*, int count, char delim="\n");        读取多个字符,字数有count指定
read(char *pch, int count);                                读取多个字符,字数有count指定,常适用于二进制文件
put(char ch);                                                        写入一个字符
wrtie(const char *pch, int count);                        写入多个字符,字数有count指定,常适用于二进制文件
举例:将文件内容保存在另一文件中,并将内容显示在屏幕上。
[cpp]#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>

void main()
{
        fstream file1;
        file1.open("test.txt",ios::in);
        if(!file1)
        {
                cout<<"不能打开!\n";
                return;
        }
        fstream file2;
        file2.open("testbak.txt",ios::out|ios::trunc);
        if(!file2)
        {
                cout<<"不能创建!\n";
                file1.close();
                return;
        }
        char ch;
        while(!file1.eof())
        {
                file1.read(&ch,1);
                cout<<ch;
                file2.write(&ch,1);
        }
        file2.close();
        file1.close();
}[/cpp]


3、随机文件操作
随机文件提供在文件中来回移动文件指针和非顺序地读写文件的能力。
对于文件的读操作,seekg函数用于定位文件指针。对于写操作,seekp用于定位文件指针。
istream &seekg(long pos);
istream &seekg(long off, ios::seek_dir dir);
ostream &seekp(long pos);
ostream &seekp(long off, ios::seek_dir dir);
其中dir的可能值有:
ios::beg        文件开头
ios::cur        文件指针的当前位置
ios::end        文件尾
举例说明:
[cpp]#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>

struct student
{
        char name[20];
        char num[6];
        int score;
}stu[5]={{"Ma","99001",88},{"Li","99002",92},{"Wang","99003",89},
                {"Yang","99004",90},{"Ding","99005",80}};

void main()
{
        student one;
        fstream file1;
        file1.open("Stu_Data.dat",ios::out|ios::in|ios::binary);
        if(!file1)
        {
                cout<<"文件不能打开!"<<endl;
                return;
        }
        for(int i=0; i<5; i++)
                file1.write((char*)&stu,sizeof(student));
        file1.seekp(sizeof(student)*4);
        file1.read((char*)&one,sizeof(student));
        cout<<one.name<<"\t"<<one.num<<"\t"<<one.score<<endl;
        file1.seekp(sizeof(student)*1);
        file1.read((char*)&one,sizeof(student));
        cout<<one.name<<"\t"<<one.num<<"\t"<<one.score<<endl;
}[/cpp]


[ 本帖最后由 infoheader 于 2008-7-7 23:11 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

版主

菜鸟

Rank: 7Rank: 7Rank: 7

金钱
110101 元 
经验
11403 点 
威望
10 点 
贡献
52 点 
精华
10 
2
发表于 2008-7-7 23:13 | 只看该作者
由于这两天其他事情比较多,加上程序调试出现了问题需要修正,发帖慢了一些,让各位久等了。

TOP

Rank: 1

金钱
13 元 
经验
0 点 
威望
0 点 
贡献
0 点 
精华
3
发表于 2010-6-19 09:18 | 只看该作者
我是来学基础的。

TOP

0GiNr安全门户 |联系我们

GMT+8, 2010-9-11 06:54.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.