![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
Message ID を書き溜めたファイルを作っています。
ヤフーメールの場合は、Message ID を比べてダウンロードするか否かを決定しています。
でも、比較が遅いように感じます。
どんなアルゴリズムがお勧めでしょうか?
よろしくお願いいたします。
いまは、次のようにして調べています。
int CSQMailBoxTreeView::isloaded(char* gszT)
{
char lbuf[256];
if( (popdatfp = fopen(".\\mailbox\\popdata.dat","r+")) == NULL ){
popdatfp = fopen(".\\mailbox\\popdata.dat","w+");
}
while(fgets(lbuf,256, popdatfp) != NULL ){
if(strlen(lbuf) == 0){
break;
}
if(strstr(lbuf, gszT) != NULL ){
fclose(popdatfp);
return 1;
}
}
fputs(gszT, popdatfp);
fputs("\r\n", popdatfp);
fclose(popdatfp);
return 0;
}
No.2ベストアンサー
- 回答日時:
質問文に書かれている方法だと1つ調べる毎に、
fopen() 1回
fclose() 1回
fgets() 最悪のケースでpopdata.datに登録されてるメッセージIDの件数分+1回
を呼び出すことになります。
仮にpopdata.datが空の状態で10件の重複のないメッセージIDを調べると
fopen() 10回
fclose() 10回
fgets() 55回(1~10の合計)
となります。
なので調べたメッセージIDが増えれば増えるほど急激に遅くなるのは当然かと。
早くするには、
・#1の方のいわれてるようにメモリ上で検索する
・データベース(dbmとか)を使用する
・メッセージIDをファイル名としてファイルを作りその有無で調べる(あまり早くならないかも)
などがあるかと思います。
ところで
>fputs("\r\n", popdatfp);
の \r は必要ですか?
Windowsだと"\r\n"はファイル上では \r\r\n になると思いますが。
この回答への補足
fputs("\r\n", popdatfp);
の \r は必要ですか?
Windowsだと"\r\n"はファイル上では \r\r\n になると思いますが。
そのとおりです。
あまりにも遅いので、データベースの sqlite を使うことにしました。
int CSQMailBoxTreeView::isloaded(char* gszT)
{
int rc = 0;
CSQMailBoxDoc* pDoc = GetDocument();
rc = pDoc->GetNumbyMessID(gszT);
if( rc != 0){
return 1;
}else{
pDoc->AddNewMessID(gszT);
return 0;
}
}
ありがとうございました。
No.1
- 回答日時:
オープンソースのメールソフトのソースでも見た方がいいんじゃないですかねぇ…とか思いますが。
>int CSQMailBoxTreeView::isloaded(char* gszT)
引数で渡されるのがサーバから取得したMessage-IDで、
ファイルから読み込んでいるのが受信済みのMessage-IDが列挙されているんですか?
『関数呼び出される度にそのファイルの内容は全く違うモノに変わる』のなら都度都度読み込むしかないでしょう。
変更されない(あるいは前回の分が追加されるだけ)なら、いちいちファイルから読み込まないでメモリ上に読み込んでおいたらどうですか?
# って追加されるパターンでしたな。
クラスのメンバにポインタ追加して、適当なタイミング(コンストラクタとか)でメモリに読み込んでおいて、追加する時はメモリ上で追加(realloc()なりで領域拡張すればいいでしょう)、適当なタイミング(デストラクタか追加された時)でファイルに書き出す…って感じですかね。
改行込みでまるっとメモリに読み込んでおいてstrstr()で検索する。という方法だって取れるでしょう。
ファイルの先頭と最後に空行を1行入れる。というのを許容するなら、引数で受け取った文字列の前後に改行追加した状態でstrstr()してもいいでしょうし。
ちなみに私はリスト構造で保持してますね。
# こういう検索する場合はリンク構造はイマイチ不利ですけど…まぁ、メモリ上に全部置いているんで。
# 大量のメールで試したコトは無いですしねぇ。(gmailを直近30日で読み込む…って時には結構時間掛かってましたかねぇ…。SSLが重いのかどうかまでは確認していませんけど)
# そっち方面で遅いって使用者からのレポート来たコトもない…ですね。(使用者何人居るのか不明ですけど)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- MySQL MYSQL エラー 2 2022/10/18 11:37
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
フリーソフトウェアでflaファイ...
-
ファイルオープンの際のウィン...
-
テキストファイルの最終行を削...
-
■ 移植性のないポインタ変換に...
-
アクセスランキング機能
-
大きいサイズのテキストファイ...
-
グローバル変数のよくない使い...
-
PDFを全文検索するプログラム
-
動画処理のライブラリについて
-
VB.NETによるプロセス間通信
-
同じ名前のファイルを作った場...
-
フルパスから最後のディレクト...
-
XSLT で XML を変換すると日本...
-
c言語として保存できない
-
バッファとは何ですか
-
バイナリエディタのつかいかた
-
どんなプログラムを書いても指...
-
VB6で、非表示モジュール(?)の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
大きいサイズのテキストファイ...
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
グローバル変数のよくない使い...
-
iniファイルに追記がしたいです。
-
Excelマクロでの再読込み方法
-
C言語のfopenについて教えてく...
-
ハッシュの計算時間について
-
VBAにてEXCEL以外のファイル(テ...
-
Javascript で INI の読み書き
-
同じ名前のファイルを作った場...
-
ASP .NETでファイル選択ダイア...
-
VBに、Cのincludeのようなもの...
おすすめ情報