0

私が書いているプログラムに問題があります。bencode (トレント ファイルで使用される) を解析するコマンド ライン パーサーです。プログラムは、コマンド ラインとしてファイル名を受け入れます。Microsoft Visual Studio 10.0 でデバッグ コマンド ライン引数設定を使用してプログラムをビルドして実行し、コマンド ラインを入力すると、プログラムは解析に失敗したことを通知します。

コマンド プロンプトを開き、同じコマンド ラインを使用してコマンド プロンプトからプログラムを実行すると、プログラムは完全に動作します。どうしたの?これは Visual Studio でよくある問題ですか?

Visual Studio のデバッガーを使用して、プログラムが失敗した場所をトレースしました。統計関数 ( http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx )の呼び出しを使用して、このファイルは Visual Studio ではエラーを返しますが、Visual Studio の外部で実行すると正常に動作します。

コードは、次の場所にある Bencode パーサーを使用しています: http://funzix.git.sourceforge.net/git/gitweb.cgi?p=funzix/funzix;a=blob;f=bencode/bencode.c

プログラムのコードは次のとおりです。

#include <stdio.h>
#include "../Parse/bencode.h"

int main(int argc, char *argv[]){
if(argc != 2){
    printf("Usage: whirlwind filename\n");
    return 1;
}

char *buf;
long long len;
be_node *n;

//read the torrent file into a buffer and store at &buf
buf = read_file(argv[1], &len);
if(!buf){
    buf = argv[1];
    len = strlen(argv[1]);
}

printf("Decoding: %s\n", argv[1]);
n = be_decoden(buf, len);

if(!n){
    printf("Parsing failed!\n");
    return 1;
}

if(n->type != BE_DICT){
    printf("This file is not a valid Bencoded Dictionary.\n");
    return 1;
}

int i;
char* keyName;

for(i = 0; i < 10; i++){
    keyName = n->val.d[i].key;
    if(keyName == "announce"){
        printf("\n\n");
    }
    printf("%s\n", keyName);
    if(keyName == "announce"){
        printf("\n\n");
    }
}

return 0;

}

4

1 に答える 1

1

Visual Studio から相対パスを渡す場合は、アプリが IDE 内で実行されたときにパスが正しく解決されることを確認する必要があります。この問題は、デバッグ時の現在のディレクトリが通常 \bin\debug であるため発生します。
安全のために、完全なパス名を入力するか、構成ファイルからファイルの場所を読み取ります。

于 2012-07-15T13:40:25.123 に答える