2009年4月18日星期六

在MFC中使用CFile类和CFileDialog

在MFC中使用CFile类和CFileDialog可以很简单的载入和保存文件……

CFileDialog文件选择对话框的使用:

首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog(
BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框
LPCTSTR lpszDefExt = NULL, //默认的文件扩展名
LPCTSTR lpszFileName = NULL, //默认的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格
LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名
CWnd* pParentWnd = NULL //父窗口句柄指针
);

LPCTSTR lpszFilter 参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。

创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择: 
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt 
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt 
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt 
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1 
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。 
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

下面是实现代码:-------------写字符串数组。
//打开文件
//创建文件名缓存(fileBuffer)和文件读取缓存(rBuffer)
//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零
char fileBuffer[5010] = {0}, rBuffer[5010] = {0};
int rBSize;
//定义一个CFile类,用来处理文件
CFile in;
//定义一个CFileDialog类,用来显示标准的打开文件对话框
CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T("自定义文件类型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
inDlg.m_ofn.lpstrTitle = _T("打开自定义文件");
//设定一个文件名缓存,因为CFileDialog内置的文件名缓存长度只有200,但是很多时候,文件的路径远大于这个数,为了保险起见,所以要自己设定一个文件名缓存
inDlg.m_ofn.lpstrFile = fileBuffer;
//设定缓存长度
inDlg.m_ofn.nMaxFile = 5000;
//显示对话框,并处理按了确定按钮的事件
if(inDlg.DoModal() == IDOK) {
//以只读方式打开文件
if(in.Open(inDlg.GetPathName(), CFile::modeRead)) {
//得到文件长度,从而确定读取缓存的大小
rBSize = in.GetLength();
//避免数组越界,当然在这里也可以动态申请缓存空间
if(rBSize > 5000) rBSize = 5000;
//读入数据
n.Read(rBuffer, rBSize);
//关闭文件
in.Close();
MessageBox("打开文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
} else {
MessageBox("打开文件失败", "失败了", MB_ICONSTOP | MB_OK);
}
}

//保存文件
//创建文件名缓存(fileBuffer)和文件写入缓存(wBuffer)
//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零
char fileBuffer[5010] = {0}, wBuffer[5010] = {0};
int wBSize;
CFile out;
CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T("自定义文件类型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
//设定保存对话框标题
outDlg.m_ofn.lpstrTitle = _T("保存自定义文件");
//使用自定义的文件名缓存
outDlg.m_ofn.lpstrFile = fileBuffer;
//设定保存文件的默认后缀,如果自己有输入后缀,则时候输入的后缀
outDlg.m_ofn.lpstrDefExt = "xxx";
//设定缓存大小
outDlg.m_ofn.nMaxFile = 5000;
//显示对话框
if(outDlg.DoModal() == IDOK) {
//得到文件名,并用创建和写入方式打开
if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) {
//在这里把你要写入文件的内容写入缓存,如果写入的内容过长,可以分次写入
//得到写入当前缓存中内容的长度
wBSize = strlen(wBuffer);
//写入文件
out.Write(wBuffer, wBSize);
//关闭文件
out.Close();
MessageBox("保存文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
} else {
MessageBox("保存文件失败", "失败了", MB_ICONSTOP | MB_OK);
}
}


***************************************************

//将数字转换成字符串来写入文件---------文件比较小,最后生成文件才 100K左右的样子,一次转换完成,一次性写入。

void CSCommTestDlg::OnSavedata()

{

// TODO: Add your control notification handler code here

//保存文件

//创建文件名缓存(fileBuffer)和文件写入缓存(wBuffer)

//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零

char fileBuffer[5010] = {0};

BYTE rxdataTemp[ROW * LINE];

for (int k=0;k<ROW * LINE;k++)

{

rxdataTemp[k] = rxdata[k];

}

CString temp;

CString strBuffer;

for (int i=0;i<ROW * LINE;i++)

 {

if ( 0 == (i+1) % LINE)

{

temp.Format("%4d\r\n ",rxdataTemp[i]);

}

else temp.Format("%4d",rxdataTemp[i]);

strBuffer = strBuffer + temp;

 }

CFile out;

CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T("文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*||"), NULL);

//设定保存对话框标题

outDlg.m_ofn.lpstrTitle = _T("保存自定义文件");

//使用自定义的文件名缓存

outDlg.m_ofn.lpstrFile = fileBuffer;

//设定保存文件的默认后缀,如果自己有输入后缀,则时候输入的后缀

outDlg.m_ofn.lpstrDefExt = ".txt";

//设定缓存大小

outDlg.m_ofn.nMaxFile = 5000;

//显示对话框

if(outDlg.DoModal() == IDOK)

{

//得到文件名,并用创建和写入方式打开

if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate))

{

//在这里把你要写入文件的内容写入缓存,如果写入的内容过长,可以分次写入

//写入文件

out.Write(strBuffer,strBuffer.GetLength());

//关闭文件

out.Close();

MessageBox("保存文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);

} 

else

{

MessageBox("保存文件失败", "失败了", MB_ICONSTOP | MB_OK);

}

}

}




***************************************************

//将数字转换成字符串来写入文件,文件量比较大时,约10M的样子。分次转换,分次写入。防止死机。

void CTestDlg::OnSavedata()

{

// TODO: Add your control notification handler code here

//保存文件

//创建文件名缓存(fileBuffer)和文件写入缓存(wBuffer)

//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零

char fileBuffer[5010] = {0};


BYTE rxdataTemp[ROW * LINE];

for (int k=0;k<ROW * LINE;k++)

{

rxdataTemp[k] = rxdata[k];

}


CString temp;

CString strBuffer;


CFile out;

CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T("文本文件 (*.txt)|*.xxx|所有文件 (*.*)|*.*||"), NULL);

//设定保存对话框标题

outDlg.m_ofn.lpstrTitle = _T("保存自定义文件");

//使用自定义的文件名缓存

outDlg.m_ofn.lpstrFile = fileBuffer;

//设定保存文件的默认后缀,如果自己有输入后缀,则时候输入的后缀

outDlg.m_ofn.lpstrDefExt = ".txt";

//设定缓存大小

outDlg.m_ofn.nMaxFile = 5000;

//显示对话框

if(outDlg.DoModal() == IDOK)

{

//得到文件名,并用创建和写入方式打开

if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate))

{

//在这里把你要写入文件的内容写入缓存,如果写入的内容过长,可以分次写入

//写入文件


for (int k=0; k<1500;k++)

{

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

{

CString strData;

strData.Format("%4d",100);

out.Write(strData,strData.GetLength());

}

}

//关闭文件

out.Close();

MessageBox("保存文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);

} 

else

{

MessageBox("保存文件失败", "失败了", MB_ICONSTOP | MB_OK);

}

}

}


//***************************************************

//对二进制文件进行读取,而且进行遍历

void CPicMovieDlg::OnOpenfile()

{

// TODO: Add your control notification handler code here

//打开文件

//创建文件名缓存(fileBuffer)和文件读取缓存(rBuffer)

//此处如果不把缓存置0,在后面的设定中就会出错,如果是动态申请的,请用memset或者for循环把数组清零

char fileBuffer[5010] = {0}, rBuffer[row * column] = {0};


//定义一个CFile类,用来处理文件

CFile in;//放到此对话框的成员变量中。因为我要持续对此文件进行操作。要有较长的生成周期。???权宜之计

//定义一个CFileDialog类,用来显示标准的打开文件对话框

CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T("自定义文件类型 (*.sav)|*.sav|所有文件 (*.*)|*.*||"), NULL);

inDlg.m_ofn.lpstrTitle = _T("打开自定义文件");

//设定一个文件名缓存,因为CFileDialog内置的文件名缓存长度只有200,但是很多时候,文件的路径远大于这个数,为了保险起见,所以要自己

//设定一个文件名缓存

inDlg.m_ofn.lpstrFile = fileBuffer;

//设定缓存长度

inDlg.m_ofn.nMaxFile = 5000;

//显示对话框,并处理按了确定按钮的事件

if(inDlg.DoModal() == IDOK) {

//以只读方式打开文件

if(in.Open(inDlg.GetPathName(), CFile::modeRead))

{

int rBSize;

bOpenFlag = 1;

//得到文件长度,从而确定读取缓存的大小

rBSize = in.GetLength();

//避免数组越界,当然在这里也可以动态申请缓存空间

if(rBSize > 100) rBSize = 100;

//读入数据

in.Seek(m_readPicCnt *100,/*CFile::begin*/CFile::begin);///从文件头开始往下移动row * column字节

dwPosition = in.GetPosition( ); //获取文件指针的当前值,可用于以后的Seek调用。

if (dwPosition > in.GetLength())

{

bEndFlag = 1;

}

m_readPicCnt ++;

in.Read(readData, rBSize);

//关闭文件

in.Close();//将此语句放在 程序结束时。

MessageBox("打开文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);

} else {

MessageBox("打开文件失败,可能您没有关闭当前文件", "失败了", MB_ICONSTOP | MB_OK);

}

}

}


 
2009-04-18

Simon

2009年4月13日星期一

我们开始变得“世故”还是开始学会了“虚伪”?

昨天晚上开会。 我提出,大学生考试诚信问题很是问题。结果很多人为自己辩解,说,如果什么都能做到,那不就是神了?
我笑:这有什么做不到的?如果这点最能体现一个学生诚信的事情你都做不到,你凭什么老在一旁唱高调,你凭什么老以高尚自居?
是我偏激了么? 是我要死咬着这个不放么?

本来,我提出的这个问题,应该是一个原则上的问题,但是却基本上遭到了大多数人的不认可,真理却遭到了打压!!

同学反问我:如果你撒谎,能救一个人的生命,你会怎么办?

我说:这根本就是不同性质的,你要我比什么 ? 难道你 通过不正当手段拿到一门课的学分,这能和 挽救一个人的生命想比??笑话!!

不过,我觉得,还是有人会支持我的,因为还有很多人没有怎么说话,可能太内心还是挺我的吧。 只是这些 为自己辩解的同学,实在是太让我感到寒心了。
因为,犯了错误,还能说得官冕堂皇的,真让人可怕。

当然,还有个同学举了这样一个例子:如果有同学 因为差几分而过不了,这个时候,你就可以适当帮下别人。 唉,这个东西,本来不应该存在的,但,我却也不能太反对,
总觉得在情面上说不过去。但:为个人生存而犯错和为个人利益而犯错是性质还是有区别的。           本来,你的考试分数就肯定会合格,而且这就是你的实际水平,那么,你为什么要作弊??就是为了自己的排名??  那这大学的考试评分制度真是太让人失望了。

2009年4月12日星期日

新时代 对联

上联:博士生,研究生,本科生,生生不息! 
下联:05届,06届,07届,届届失业! 
横批:愿读服输 
 
上联:金沙江,嘉陵江,黑龙江,江江可投! 
下联:飞跃楼,教学楼,宿舍楼,楼楼可跳! 
横批:空前绝后 
 
上联:爱国爱家爱师妹! 
下联:防火防盗防师兄! 
横批:恋爱自由 
 
上联: 男生,女生,穷书生,生生不息! 
下联: 初恋,热恋,婚外恋,恋恋不舍! 
横批:生无可恋 
 
上联:相遇,相识,相知,相爱必须! 
下联:小吵,吵吵,大吵,分手难免! 
横批:爱狠交织 
 
上联:我爱的人不爱我 
下联:爱我的人我不爱 
横批:命苦 
 
上联:上网,打牌,谈恋爱,虚度四年光阴, 
下联:考研,出国,找工作,生活猪狗不如 
横批:吃饱了撑的 
 
上联:考初中 考高中 考大学 考考都愁 
下联:抄语文 抄数学 抄英语 抄抄就过 
横批: 不信挂科 
 
上联:昨日,今日,明日,日日难熬 
下联:早餐,午餐,晚餐,餐餐难进 
横批:大学生活 
 
 
 
上联: 昨夜校园漫步,看见青蛙装酷,呕吐,呕吐,只能拿头撞树 
下联: 昨晚球场摆酷,忽闻恐龙撞树,恐怖,恐怖,可怜那棵小树 
横批: 倩女幽魂 
 
上联:好说,难说,好难说 
下联:思你,念你,思念你 
横批:真爱无悔 
 
上联: 忆往昔峥嵘岁月,老婆一个,孩子一帮。 
下联: 看今朝太平盛世,孩子一个,老婆一帮。 
横批:与时俱进 

2009年4月7日星期二

说偏激


十世纪最重要的政治哲学家之一:Hannah Arendt

 

说偏激

 

萧瀚

 

我经常被人教育:"你太偏激了。"

 

对于这样的教育,我是很不屑的。这样教育我的人,大抵没什么脑子,你让伊讲个子丑寅卯,什么地方偏激了,为什么偏激了,指出条道道来,偏激的理由是什么,什么是正确的,不偏激的,伊一般支支吾吾,顾左右而言他。

 

很简单,仅仅凭着感觉,说人偏激,是不负责任的,这种没经过有效论证的判断,不值一哂。

 

偏激什么意思,《现代汉语词典》解释为"(意见、主张)过火"。这解释差不多等于没解释。什么叫过火?烧得太猛了?做饭还是烧水?

 

中国人是讲究中庸的,我也是,不过我和绝大部分人挂在嘴上那支高级雪茄似的中庸,一点关系都没有。

 

孔子的孙子子思,是《中庸》的作者,是中庸思想的发明家,也是中国在哲学领域最重要的思想家之一,理学大师程氏兄弟这样解释中庸:"不偏之谓中,不易之谓庸。中者,天下之正道,庸者,天下之定理。"朱子在《四书章句集注》中这样解释中庸:"中者,就是不偏不倚。无过无不及之名。庸,平常也。"可见,中庸者,理也,理者,道也。

 

在现实中,我遇到许多人,他们把和事佬当成中庸的代表;把不分是非的和稀泥当成中庸;把回避问题本质当成中庸;把对真理的恐惧粉饰成中庸。依我之见,倘以子思、子程子、朱子的标准来衡量,这种表面上的折衷,实际上离道最远,再刻薄一点,那就堕入所谓的伪儒、小人儒恶道了。孔子当年在鲁国当司寇,因为"八佾舞于庭,是可忍孰不可忍。"而走人,恐怕那帮"中庸"人士也一定认为他偏激得可笑。如果他们这样就是中庸的话,那我还真愿意要这个偏激的恶名。

 

我的朋友摩罗先生,当年在其名著《耻辱者手记》里那句震撼我的话:

 

"倘若他们自视为救主,我就甘为叛神,倘若他们自视为圣灵,我就甘为邪念,倘若他们自视为人,我就只有做魔鬼。"

 

在一个常识已经失去了地位的国度,在一个犬儒主义风行于世的时代,坚持常识居然成了一个社会最重要的思想——是的,别说没有可悲到这地步!就是在那些穷吹当代中国能够出现思想大家,出诺奖科学家,出什么什么家的人的嘴里,你又听到过多少他们敢说出来的常识呢?要是连常识都不敢说,还能有什么大家,岂非痴人说梦?

 

在这样的时代,说出常识,常常要付出代价,它可能是你的工作,可能是你的家庭,可能是你的自由,甚至可能还是你的生命。

 

我不得不很认真,很负责任地给自己一个评价:我是个懦夫,因为我从来不敢说出所有常识。为了一点过于可贵的尊严和自由,我只是在选择性地说出常识。我那些说出全部常识的朋友都在监狱里,或者曾经在监狱里呆过。我唯一还剩下的一点点勇气,就是承认自己是个懦夫。诚如摩罗先生一直提倡的要有耻辱意识,是的,这耻辱意识我自诩还是有一点的。

 

这么多年来,被人教育不要偏激的时候,我深知,在绝大多数情形下,教育者存在三种情况。

 

一种是他们自己在内心里想法和我差别不大,但有些话不愿意别人当众说出来,因为这跟通常你好我好大家好的河蟹状态实在太不协调,这是对所有人的冒犯,冒犯了他们集体沉默的权利——当然是权利,一种基本的消极自由,呵呵。这在中国知识界是常态,是常识!他们可以羡慕西方的人文主义传统,可以羡慕美国的宪政制度,羡慕法国的知识分子传统,但是也就羡慕罢了。他们可以在一切重大的社会问题面前失语失明失聪,他们的三思而行,只是"三失才行"的意思。摩罗十年前痛骂中国知识人的萎靡与不知耻,现状并没有改变。中国人里没几个人配说自己是知识分子,一般而言,中国的知识分子应该在坟墓或者监狱里,或者甚至是在被活埋的无名氏花名册上,少数漏网的也没几个——还不能举例,不然简直变成通风报信、落井下石了。

 

第二种情形是,"教育"我的人本身就是脑在水中央的人,他们受了多年奴化教育,许多奴格教条早已像他们的影子一样,刀刻火烙在他们麻木的心灵中,当你用常识轰击他们的麻木时,他们本能的反抗就是说你偏激,说你太激烈了。这种人如果没有彻底蜕变为斯德哥尔摩综合症患者,已是天字第一喜。因此,对他们的不要偏激之教导,我连反驳的兴致都没有。

 

第三种情形是,一些好朋友担心我在学术上走上歧路,或者干脆就是担心我的安全问题,于是要给我泼泼冷水,但是这冷水一不小心,就差点变成了脏水,对于这样的关心,我只有苦笑,因为他们的好意和善意,我唯有心领,别无可说之语——毕竟,人不是为学术而生活,而是因为生活而思考,那些半生不死、木乃伊一样的所谓学术,于我只是垃圾,除了清理掉,没有其他用途,谈何歧途。

 

然而,无论哪种情形,在一个问题上是共同的,那就是暗示了一个建议:宁可不要常识,因为你说出的这个常识对他们来讲,不但没有意义,可能还让他们意识到自己的无奈,而这是令人不快的。不管出于他们自己的需要,还是出于关心我的必要。任何一个追求真实生活的人,都不可能依靠回避去建立真正的生活,恰恰只有在承认的基础上,才能超越令人不快的现实,从而建立有意义的生活。我所看重的,是常识于我自己之重要,及其传播之重要,因为它意味着提醒更多的人正视现实。如果我们不捍卫常识,不将常识从现实的迷离乱相中拯救出来,中国将一代代地盛产脑残人士,如果我永远生活在这样的环境中,活不活又有多大区别——如苏格拉底在法庭上的最后陈词,我去死,你们继续活下去,但你们并不知道我和你们哪一个更好。

 

我对常识曾有个定义,常识就是尊重人性、理解人性,就是对真善美恒久的向往和追求,也就是如今我更加简洁的概括:对美愛精神的坚持和具体的生活实践。

 

在我们的生活中,常识与反常识既有被遮蔽的一面,又有无处不在的一面。如果我们仅仅看到生活中的真善美,忽略了那些普遍存在的假丑恶,这是一种虚假的乐观主义,是一种精神脆弱。面对丑恶关闭我们的一切感官,这只是鸵鸟,无助于真善美愛的增加。那些教导我不要偏激的人们,只是看到我对假丑恶的厌恶,而他们如果不是已经习惯,就是觉得无奈——"你再说也没什么意义"。如果我们仅仅看到听到假丑恶,却不能发现生活中的美好,那么这样的心灵必定会陷入绝望与黑暗之中。然而,这个时候,他们也许会说你这些说法,这些努力,都太理想化了。

 

是的,说人理想化与说人偏激,常常只是一种姿态的两面而已。由此,我们将看到,心中失去希望的人,或者沉沦于庸盲世界者,他们的神经十分脆弱,他们既经不起你指出的丑恶真相,也经不起你追求的美愛世界。他们恐惧你所指出的真相,说你这是耸人听闻的偏激认识,他们也怀疑你所追求的美好是虚幻的。

 

说穿了,其实只是一个问题,对于指出常识的言论,以偏激冠之,在本质上只是以一种情绪性的感官来衡量,而不是以理性来考察的结果。在很多问题上,如果不能从一个公共生活的角度看待一切被斥之为偏激的言论,只是因为自己对公共生活的淡漠和麻木所致,并非指出这些问题的人说错了。

 

举一个例子来说就清晰了。

 

从一个整体的视角看待,如果说中国的公共生活领域一无是处,这难道无法成立吗?仔细想想,你有没有选举权?你有没有质疑征税权合法性的权利?你每个月被扣去的税收,其税率征求过你的同意吗?你有没有成立独立党派的自由?你有没有办报的自由?你有没有不经审查就出版自己言论的自由?你有没有最想表达的事关公共问题的言论自由?你有没有游行示威的自由?你有没有请愿的自由?你有没有不受电信剥削的自由?如果你是出租车司机,你有没有自主成立公司的自由?……这样的例子举出两千三千个都不是问题,还用我继续说下去吗?

 

结论已够明显,我说这些偏激吗?当然有人告诉我,你的言论已经很自由了,这不都让你说了吗?如果国人都这样看待言论自由,那么我敢断定,中国将永远不可能有言论自由,所幸,中国人并非都如此!

 

这些例子都说明一个简单的道理,在中国,运用我们的理性去看待问题,去分析问题,还十分稀缺,在大量情况下,人们没有能力看清私人生活与公共生活的差异,而是经常将两者一锅烩。大量国人,在私人生活的侥幸安全中,漠然于公共生活,两者形成了恶性互动的局面。

 

而对于所谓偏激的指责,便是生长于这样的土壤。

 

英国大众伦理学家Samuel Smiles在《Character》(国内译本书名叫《品格的力量》)中写道:"以前,溜须拍马表现为不敢对那些地位较高的人说实话,但是,现在,溜须拍马却表现为不敢对那些地位较低的人讲实话。"究其原因,密尔在《Of Individuality, as One of the Elements of Well-Being》一文里说得很清楚:

 

"凡智慧与高贵之事,总是也必然是发端于某些个人,最初通常是某个具体的个人。……舆论是暴君,它总是谴责特立独行。在这个时代,不屑于从众,拒绝流俗,这本身便是一大贡献。为了突破舆论的暴政,就应当保持特立独行。性格类型丰富之时之地,也便是特立独行者丰饶之所。社会中特立独行者的数量与该社会所拥有的天才禀赋、精神活力和道德勇气的数量成正比。敢于特立独行者如此之少,是当代最危险之事。"

 

由此可见,人们挂在嘴边的对所谓偏激的指责,恰恰正是密尔倡导希望人们挣脱的枷锁,正是他笔下的舆论之暴君。

 

汉娜.阿伦特在《耶路撒冷的艾希曼》一文中提出了一个很重要的概念,就是"庸常之恶"("evil of banality",徐贲先生译为"平庸的恶"),阿伦特指出了所有制度都有一种倾向,就是将每个人都变成"官僚",这种"官僚"特性将人非人化,于是每个人都成为巨大国家机器上的一个齿轮、一颗螺丝钉,例行每天平庸无奇的恶行,这种恶行由此内化为人的第二天性——习惯。而这种状态在极权政治之下达到其巅峰之境。

 

由此,庸常之恶便成为整个社会的社会心理基础,舆论便是在这个基础上形成的,而舆论的威力,正如罗素在《权力论》中所说:"舆论是一切社会事务的最终权力。"

 

在汉娜.阿伦特经典的极权政治研究表述中,纳粹德国和斯大林苏联是典型的极权国家——由于资料的匮乏,她的研究中显然少了不止一个国家。以"文革"为核心标志的中国30年国家精神病时代,也是一个典型的极权时代。那种状态所形成的舆论环境中,人们清晰地看到那些特立独行的"偏激"者所罹临的厄运是什么:被庸众打杀、被当局投入监狱甚至枪杀,最高待遇也得沦为贱民。

 

当代中国,当市场经济在步履蹒跚中前行的时候,许多人走出体制的束缚,走出"官僚化"牢笼之后,上述这样的舆论统一就被打破,舆论的一律状态渐行远去。近30年的经济发展与社会开放,都让人们看到这种舆论多元所带来的新气象。于是,在大众舆论中开始出现"偏激"之见,出现特立独行的人物,给这个社会注入新鲜的血液。只是那些齿轮们、螺丝钉们依然不能接受这样的现实。而更有不少人在长期的奴格教育中,一些毒素已经深种脑际,即使脱离了"官僚化"的生活,依然至少在一定时期内,延续着原有的思维方式和行为方式。而且这种力量一时还非常强大,使得身处其间的特立独行者无以感受到来自各方的最强有力支持。

 

但是,无论如何,人们可以从不少80后、90后的"新新人类"身上看到希望,他们正在成为未来多元社会的主导力量,这从他们的着装、对不寻常观点的接受度以及对他人的宽容度上都可以清晰的看到其未来性。倒是那些讥讽他们为"垮掉的一代"的人,我还真希望他们有空的时候不妨揽镜自照,垮掉的到底是谁?近期的一个突出例子是一群人打着维护大师的旗号,对韩寒口诛笔伐——只是因为韩寒说他认为巴金、冰心和茅盾的文笔不怎么样,说实在的,这三个作家的作品,除了茅盾的作品,我觉得还有可看之处,其他两位我从来都觉得一般得很(不过他们两位的翻译作品我还是挺喜欢的)。这些施行舆论暴政的人,说实在的,这次没有捞到任何便宜,倒像是让人看了一场免费滑稽剧,因为年轻人们已经不再那么好糊弄,也不像20年前那么狭隘、愚昧、霸道。

 

可见,这个社会的观念确实已经越来越开放,仅仅社会性而非政治性的惊世骇俗之论,至少不会招致囹圄之苦、杀身之祸。

 

这是一个很好的开端——"偏激"不再给特立独行者带来太多的危险,那么不妨继续"偏激"下去,这是所有特立独行者的权利。

 

                                            2008年7月6日於追遠堂

〔Z〕丧钟为谁而鸣

英国诗人约翰·多恩(1572-1631)有一首诗提到丧钟,颇有名,大意是:没有人是一座孤岛,/可以自全。/每个人都是大陆的一片,/整体的一部分。/如果海水冲掉一块,/欧洲就减小,/如同一个海岬失掉一角,/如同你的朋友或者你自己的领地失掉一块:/任何人的死亡都是我的损失,/因为我是人类的一员,/因此/不要问丧钟为谁而鸣,/它就为你而鸣。有人采旧式译法翻译本诗,云:"人非孤岛孑然立,都与神州合而一。土随水去地基小,山平宅没大陆低。人若亡故我亦少,我与人人共一体。若闻丧钟何须问,为人也是为你击。"

这首诗虽然简短,但含义深刻,表达了一种悲天悯人、推己及人的人生态度。海明威喜爱这首诗,把它放在自己一部小说的正文之前标明主题,小说也用诗中的一句话作为书名:丧钟为谁而鸣(For whom the bells tolls)。小说的背景是西班牙内战,当时美国志愿者罗伯特·乔丹奉命去炸毁一座桥,书中描写了三天中发生的故事。《丧钟为谁而鸣》是海明威写得最长的小说。

"丧钟为谁而鸣"这个短语,大概已经成为西方社会许多人熟悉的典故,甚至已经成为一句成语。它含有悲天悯人的意味。王小波在《从Internet说起》一文中,揭示说:"海明威在《钟为谁鸣》说过这个意思:所有的人是一个整体,别人的不幸就是你的不幸。所以,不要问丧钟是为谁而鸣——它就是为你而鸣。"也就是说,整个人类是个命运共同体,别人的不幸就是你自己的不幸,这就是约翰·多恩这首诗的主旨。

2009年4月6日星期一

当Blogger 碰到Twitter.

当 像 Twitter,饭否  这样的 MicroBlog 兴起后,发现自己很少有时间来到这个上面写东西了。唉。 可能这种博客需要太多精力吧,不如 微博客 那样 快餐级的方便。
 
2009-04-06

Simon