6 件 見つかりました。

CHALOW Search - hiChangeLog ChangeLog INDEX

libpngとzlibを使用したVC++のプロジェクトで「競合」によるビルド失敗が、マルチスレッドDLLで解決した [Windowsプログラミング][C/C++][画像ファイル]

libpngzlibを使って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 を使用してください。

libpng生成とpng出力も参考にした。

maildropとMaildir形式とmh形式 [C/C++][メール]

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.

メールを読むのにはWanderlustを使用している。だがこれだと(Wanderlustのせいではないのだろうが)Maildir形式のメールを読むのは重く、一方mbox形式だと複数メールで1ファイルなので何かのきっかけで多数のメールを巻き込んでオシャカになるのが怖い。なんでmh形式でメールを読みたい。

maildropでmh形式の保存はできないようだ。procmailならできるみたいだが、設定ファイルの書式が意味不明なので使いたくない。そこで、Maildir => mh の変換ができないもんかと考え、調べたが、同様な考えの人は多くないみたい。

しょうがないので、そのためのプログラムを書いてみた。標準入力の内容に連番のファイル名をつけて保存するだけのもの。maildropは任意のプログラムにメールの内容を標準入力経由で渡せるので、これを用いればmaildropから連番ファイル名でメールを保存できる。これを「mh形式」と呼んでいいのかどうかは知らん(既存プログラムのソースを突き合わせて確認する必要があるがやってない)が、こうしてたまったメールはWanderlustから無事読めているので、問題無さげ。実際、http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/win2linux/w2l-tools/scripts/mbox2mh?rev=1.4 を見てもメールの中身に連番ファイル名を振ってるだけみたいだし。

#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);
}

Referrer (Inside): [2008-01-05-2]

C言語でカレントディレクトリのファイルを列挙する [C/C++]

カレントディレクトリのファイル一覧はlsやdirコマンドで取得できる。これをC言語からやるにはどうすればよいか?

system("ls")
がひとつの解。でもコマンドを使わない方法もある。

UNIX/Linux環境ならopendir/readdir/closedirが使えるようだ。
#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 (..)

}

WindowsならFindFirstFileとか。
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 (..)
}


参考:
-コンピューター:C言語講座:ディレクトリ内容の読み出し
-C言語で、カレントディレクトリのファイル一覧を表示する、コマンドってありますか?
-サブフォルダ(サブディレクトリ)も含めてファイルを検索するには?

C言語でログを取る関数を書いた。 [C/C++]

表題の通り。何の工夫もないが、時間を扱うためのコード雛形としてメモっとく。

#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);
}

正規表現モジュールとしてはpcreやboostなどがある [C/C++]

タイトルの通り。今使うわけじゃないがメモする
http://www.pcre.org/
http://www.kmonos.net/alang/boost/classes/regex.html

仮引数リスト中の省略とCとC++と [C/C++]

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
Powered by chalow