#include <stdio.h>
#include <termios.h>
char getch(void) {
char buf = 0;
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return (buf);
}
int main() {
char key;
printf("Press 'x' to exit...\n");
while((key=getch()) && (key != 'x'))
printf ("you pressed %c\n", key);
return(0);
}
Reference
TAG
首都機能移轉
(2)
歌詞
(2)
靠北文
(40)
戲言
(30)
糟糕
(7)
ACG
(23)
Assembly
(2)
Boost
(2)
C
(31)
C++
(69)
CMake
(4)
CSIE
(67)
Debian
(34)
Design_Pattern
(2)
Django
(1)
Eclipse
(1)
en_US
(13)
FFmpeg
(3)
FoolproofProject
(26)
FreeBSD
(2)
Git
(4)
GNU_Linux
(65)
IDE
(5)
Java
(11)
JavaScript
(19)
KDE
(15)
Khopper
(16)
KomiX
(3)
Kubuntu
(18)
Life
(1)
Lighttpd
(2)
Mac_OS_X
(2)
Opera
(1)
PHP
(2)
PicKing
(2)
Programing
(21)
Prolog
(1)
Python
(7)
QSnapshot
(2)
Qt
(30)
Qt_Jambi
(1)
Regular_Expression
(1)
Shell_Script
(7)
Talk
(98)
VirtualBox
(7)
Visual_Studio
(13)
Windows
(18)
zh_TW
(36)
2008年1月28日 星期一
getch()的POSIX實作
直接觀看封裝/壓縮過的檔案
Unix-like的紀錄檔通常在經過一定時間後就會壓縮為gz檔,為此可以使用如下的指令直接閱讀,不需要真正解開成一個檔案:
gzip -cd file.gz | less
如果壓縮過之前還被封裝過,就要換個程式:
tar -ztf file.tar.gz | less
於是,再一次地我們要發揮程式設計員的美德之一:懶惰。
每次都要打那些指令太煩了,所以我寫了一個bash shell,名叫xless[?],自己根據檔案類型展開。
每次都要打那些指令太煩了,所以我寫了一個bash shell,名叫xless[?],自己根據檔案類型展開。
#! /bin/bash
if [ $# -eq 1 ] ; then # 只接受一個參數
if [[ $1 =~ '\.tar\.gz$' ]] ; then # 以regex過濾*.tar.gz
exec tar -ztf $1 | less
elif [[ $1 =~ '\.gz$' ]] ; then # 再過濾*.gz
exec gzip -cd $1 | less
else
echo 'Invalid filename.'
fi
else
echo 'Must takes one argument.'
fi
然後再把這個檔案改成可執行檔,export到PATH裡,就可以隨時取用了。
類別:
Shell_Script
Copy Right真絕....
剛才為了要寫一個能在Windows[?]下控制防火牆的程式,但是測試用的code竟然不能用,因為它需要netfw.h,而之前下載的Windows® Server 2003 SP1 Platform SDK裡沒有包含;仔細看一下文件才發現這已經不是最新的Platform SDK,而且也不會再更新了,目前最新的是Windows® Server 2003 R2 Platform SDK,無奈的是它要通過WGA認證才能下載。
其實我也不是在說微軟怎樣,只是這樣會讓我的compile-time需求又多上一筆....
2008年1月27日 星期日
2008年1月18日 星期五
如何讓你的程式更難理解(2)
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <boost/lambda/lambda.hpp>
using namespace std;
using namespace boost::lambda;
int main( int argc, char * argv[] ) {
vector< size_t > v;
copy( istream_iterator< size_t >( cin ), istream_iterator< size_t >(), back_inserter( v ) );
sort( v.begin(), v.end(), _1 > _2 );
for_each( v.begin(), v.end(), cout << _1 << '\n' );
return 0;
}
以上和以下同義:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template< typename T > inline bool gt( T a, T b ) { return a > b; }
int main( int argc, char * argv[] ) {
size_t temp;
vector< size_t > v;
while( cin >> temp ) {
v.push_back( temp );
}
sort( v.begin(), v.end(), gt< size_t > );
for( size_t i = 0; i < v.size(); ++i ) {
cout << v[i] << '\n';
}
return 0;
}
簡單地說,先從輸入串流讀入一串數字存入陣列,再反序排序,最後全部印出來。
首先仔細地檢視我們要什麼。事實上輸入的動作只要從串流複製一份資料到陣列裡即可,因此使用algorithm的copy和iterator的功能就可以達成目的。
至於排序,預設是遞減排序,其他排法必須要另外再寫一個比較函式。因此這裡使用Boost的lambda函式來減少多餘的宣告。lambda function就是一個臨時的匿名函式,不少高階語言都有,但是C++目前的標準函式庫沒有;Boost是C++標準委員會所擴充的函式庫,基本上很有希望加入為新的標準。
最後是輸出;其實這裡用copy也可以,只是這樣就很難在項目之間插入空白或換行,因此使用algorithm的for_each加上lambda functor。
首先仔細地檢視我們要什麼。事實上輸入的動作只要從串流複製一份資料到陣列裡即可,因此使用algorithm的copy和iterator的功能就可以達成目的。
至於排序,預設是遞減排序,其他排法必須要另外再寫一個比較函式。因此這裡使用Boost的lambda函式來減少多餘的宣告。lambda function就是一個臨時的匿名函式,不少高階語言都有,但是C++目前的標準函式庫沒有;Boost是C++標準委員會所擴充的函式庫,基本上很有希望加入為新的標準。
最後是輸出;其實這裡用copy也可以,只是這樣就很難在項目之間插入空白或換行,因此使用algorithm的for_each加上lambda functor。
不要問我為什麼使用using namespace...這只是示範....
2008年1月16日 星期三
2008年1月14日 星期一
La Fonera花轟了
不知道為啥只要La fonera想移植就會卡到陰,昨天reset鍵按了五秒左右,就回到出廠值了。
詭異的是default gateway變成192.168.182.1,而且沒辦法由這個位址連線回去更改設定....
我應該找誰呢?(攤手)
詭異的是default gateway變成192.168.182.1,而且沒辦法由這個位址連線回去更改設定....
我應該找誰呢?(攤手)
2008年1月10日 星期四
訂閱:
文章 (Atom)