6 件 見つかりました。
libpngとzlibを使ってVC++(non MFC)でプログラムを書こうと思った。(VS.NET 2003)
まずはライブラリをコンパイルする。libpng-1.2.22-no-config.tar.gzとzlib-1.2.3.tar.gzをダウンロードした。展開し、zlibの内容をlibpngと「兄弟」となるように配置(例えばC:\temp\libpng\(libpngの中身)、C:\temp\zlib\(zlibの中身))。で、(libpng)\projects\visualc71\libpng.sln を開き、ビルド => 構成マネージャから LIB Release を選んで、ビルドするとライブラリができる。このあたりは (libpng)\projects\visualc71\README.txt に書いてある。Win32_LIB_Releaseディレクトリのlibpng.lib、zlib.libを、またソースファイルからpng.h、pngconf.h、zlib.h、zconf.hを持ってくれば使用準備は整う。
さてプログラムを書いてビルドしたらば、「競合」によって失敗した。内容から解決法まで、下記と同様であった。
2006-10-26 - 王様の箱庭::blog
エラーは下記のようなものである。プロジェクトのプロパティから C/C++ => コード生成 => ランタイムライブラリ を「マルチスレッドDLL」にすることでエラーは消えた。なぜうまくいったかは理解していない。
... step1 error LNK2005: _abort は既に LIBC.lib(abort.obj) で定義されています。 ... step1 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 step1 warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
maildropを便利に使用している。これはメールを振り分け後Maildir形式かmbox形式で保存する。以下 man maildropfilterの記述の抜粋。
TO - DELIVER MESSAGE TO A MAILBOX
to expression
The to statement delivers the message to a mailbox. expression must
evaluate to a valid mailbox. A valid mailbox is either a mailbox file,
a maildir, or an external program (which includes forwarding to another
address).
(中略)
Otherwise, expression names the mailbox where maildrop delivers the
message. If expression is a directory, maildrop assumes that the
directory is a maildir directory. Otherwise, maildrop will deliver the
message to a file, formatted in traditional mailbox format. maildrop
will use either dot-locking, or flock()-locking when delivering the
message to the file.
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <dirent.h>
void log(const char*);
unsigned int LargestFilenameNumber(const char*);
int main(int argc, char* argv[]){
char c;
FILE *fp;
char fname[256];
int newfilenum;
const char* dirname = argv[1];
if(argc != 2){
log("invalid argument");
return -1;
}
newfilenum = LargestFilenameNumber(dirname)+1;
if(newfilenum == 0){
log("error in LargestFilenameNumber");
return -1;
}
if(dirname[strlen(dirname)-1] == '/') sprintf(fname, "%s%d", dirname, newfilenum);
else sprintf(fname, "%s/%d", dirname, newfilenum);
fp = fopen(fname, "w");
if(fp == NULL){
log("error in file opening");
return -1;
}
while(1){
c = fgetc(stdin);
if(c == EOF) break;
fputc(c, fp);
}
fclose(fp);
return 0;
}
unsigned int LargestFilenameNumber(const char* dirname){
DIR *dir;
unsigned int filenum, filenum_max;
char dummy;
char fname[256];
struct dirent *dp;
if((dir=opendir(dirname))==NULL) return -1;
filenum_max = 0;
while((dp = readdir(dir)) != NULL){
if((strcmp(dp->d_name, ".")==0) || (strcmp(dp->d_name, "..")==0)) continue;
// sscanf return value ex. "1.eml" => 2, "hoge" => 0, "67" => 1
if(sscanf(dp->d_name, "%u%c", &filenum, &dummy) != 1) continue;
filenum_max = filenum_max > filenum ? filenum_max : filenum;
}
closedir(dir);
return filenum_max;
}
void log(const char* str){
FILE *fp;
struct tm *st;
time_t t;
char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
t = time(NULL);
st = localtime(&t);
fp = fopen("hiStdin2Mh_log", "a");
fprintf(fp, "%d %s %.2d: %.2d:%.2d:%.2d\n", st->tm_year+1900, month[st->tm_mon], st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec);
fprintf(fp, "%s\n\n", str);
fclose(fp);
}
カレントディレクトリのファイル一覧はlsやdirコマンドで取得できる。これをC言語からやるにはどうすればよいか?
system("ls")
がひとつの解。でもコマンドを使わない方法もある。
#include <stdio.h>
#include <dirent.h>
unsigned int ListFilesAndCountFileNum(void){
DIR *dir;
int filenum;
struct dirent *dp;
if((dir=opendir("./"))==NULL) return -1;
filenum = 0;
while((dp = readdir(dir)) != NULL){
filenum++;
printf("#%d: %s\n", filenum, dp->d_name);
}
closedir(dir);
return filenum-2; // subtracting current-directory (.) and parent-directory (..)
}
int ListAndCountFiles(const TCHAR* mask){
WIN32_FIND_DATA w32fd;
HANDLE hfind = FindFirstFile(mask, &w32fd);
int i = 0;
if (hfind != INVALID_HANDLE_VALUE) {
do {
i++;
printf("#%d: %s\n", i, w32fd.cFileName);
} while(FindNextFile(hfind, &w32fd));
}
FindClose( hfind );
return i-2; // subtracting current-directory (.) and parent-directory (..)
}
表題の通り。何の工夫もないが、時間を扱うためのコード雛形としてメモっとく。
#inlucde <stdio.h>
#include <time.h>
void log(const char* str){
FILE *fp;
struct tm *st;
time_t t;
char month[][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
t = time(NULL);
st = localtime(&t);
fp = fopen("log", "a");
fprintf(fp, "%d %s %.2d: %.2d:%.2d:%.2d\n", st->tm_year+1900, month[st->tm_mon], st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec);
fprintf(fp, "%s\n\n", str);
fclose(fp);
}
タイトルの通り。今使うわけじゃないがメモする
http://www.pcre.org/
http://www.kmonos.net/alang/boost/classes/regex.html
Advanced Windowsの記述にならって、使用しないWinMainの第2引数は以下のように省略していた。
#include <windows.h>
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, PWSTR psCmdLine, int nCmdShow){ return 0; }
でもこれは main.cpp ならOKだが main.c とかに記述するとエラーになった。CとC++の言語仕様の違いなんだろう。もちろん以下のように省略しなければ全く問題ない
#include <windows.h>
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PWSTR psCmdLine, int nCmdShow){ return 0; }
ChangeLog INDEX