0

私はこの問題にしばらく悩まされてきました。ここにあるのは、ファイル名を含むテキストファイルを読み取るループです。ループはこれらの行を1つずつ読み取り、変数sFileNameを介してメモリに設定します。sFileNameは後で画像をロードするために呼び出され、ループが画像をロードするときにプログラムがこれを1つずつ実行します。次に、ユーザーは画像のタグを選択し、次のタグをロードします。タグと画像ファイル名は、imgresults.txtという名前の別のテキストファイルにエクスポートされます。現在、ファイル名を含むテキストファイルは数千行です。したがって、ユーザーがプログラムを終了して後で続行しようとした場合、プログラムが閉じられた時点で中断するのではなく、ループが再開されます。

その時点でループを開始する方法を見つけようとしています。これまでのところ、getline()を使用して、現在imgresults.txtにある行数をカウントすることにしました。これにより、プログラムで既に実行された画像の数がわかります。この番号は変数「x」に格納されます。私は多くの調査を行ってきましたが、whileループが行"x"で始まる条件を設定する方法が見つかりません。何か提案はありますか?また、ご不明な点がございましたらお問い合わせください。画像をロードするためのコードなどは問題ないので、ループに関するコードのみを含めました。

int _tmain(int argc, _TCHAR* argv[])
{

    int value = 0;

int nCounter = 0;
FILE* fIn = NULL;
char * sLine = new char[MAX_FILENAME_SIZE];
char * sFileName = new char [MAX_FILENAME_SIZE];
char * s = new char [MAX_FILENAME_SIZE];

#define ImgListFileName "path"
#define ImgRepository "path"



if ((fIn = fopen(ImgListFileName,"rt"))==NULL)

{
    printf("Failed to open file: %s\n",ImgListFileName);
    return nCounter;
}



ifstream imgresults;
    imgresults.open ("imgresults.txt");
    int x=0;
    string line;

    while(!imgresults.eof()) {
        getline (imgresults, line);
        x++;
    }
    srand (time(NULL));
    cout << x;


    while(!feof(fIn)){
        memset(sLine,0,MAX_FILENAME_SIZE*sizeof(char));
        memset(sFileName,0,MAX_FILENAME_SIZE*sizeof(char));
        memset(s,0,MAX_FILENAME_SIZE*sizeof(char));
        fgets(sLine,MAX_FILENAME_SIZE,fIn);
        strncpy(s,sLine,65);
        strcat(sLine,"\0");
        strcat(sFileName,s);


        printf (sFileName);

        nCounter++;
}

前もって感謝します!

4

4 に答える 4

1

ifstream :: tellgを使用して、プログラムが閉じられたときのファイルの現在の位置を取得して保存します。

ifstream :: seekgを使用して、ポーグラムが再起動したときにその位置を復元します。

于 2012-07-08T15:21:50.390 に答える
1

入力ファイルから開始する場所に関する情報としてimgresults.txtを本当に使用したい場合は、whileループを使用して、入力ファイルからx行を読み取るwhileループの直前に読み取るのが最善の方法です。入力ファイル。

while (x--) {
    fgets(sLine, MAX_FILENAME_SIZE, fIn);
}

より良い解決策は、おそらく処理の状態を別のファイルに書き込んで、入力ファイルを1行ずつ読み取る必要がないようにすることですが、ファイル内の既知のオフセットをすぐに探すことができます。

于 2012-07-08T15:26:24.353 に答える
0

各行を読み取る前に、入力ファイルと出力ファイルの現在のオフセットを別のファイルに保存し、最初に戻って既存のデータを毎回上書きします。

再起動するとき/再起動する場合は、そのファイルからオフセットを読み取り、それらのポイントを探して、そこから作業を開始します。

于 2012-07-08T15:37:39.233 に答える
0

両方のファイルから並列に行を読み取り、結果ファイルの終わりに達したときに停止することができます。ループが終了すると、すでに処理されたファイル名はすでに破棄されています。

ifstream results("results.txt");
ifstream names("names.txt");

if (results && names) {
    std::string temp1, temp2;
    while (getline(results, temp1) && getline(names, temp2)) ; /* do nothing */
}

if (names) {
    // process the rest
}

最も効率的なソリューションではありませんが、オフセットを保存する手間を省くことができます。最初の処理の前に、結果ファイルが完全に空である(またはまったく存在しない)ことを確認してください。そうでない場合、このコードは名前ファイルの最初の行をスキップします。

于 2012-07-08T15:38:04.260 に答える