2

さて、一度に 1 つのチャプターで読みたい巨大なファイルがあります。章は で区切られ'$'ます。私はまだ C++ にあまり慣れていないので、C/C++ で期待されるように、章で読むようなものを作成しました。

#include <nds.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <sstream>

int dataFileLoc = 7;

std::string fileReader(){
    FILE * dataFile;
    std::string chapterBuffer = "";
    const int buffersize = 1024;
    char charBuffer[buffersize];
    bool foundEnd = false;
    dataFile = fopen("xc3_.tsc", "rt");//open data file
    fseek(dataFile,dataFileLoc,SEEK_SET);
    while(!foundEnd){
        fread(charBuffer,1,buffersize,dataFile);
        for(int i=1; i<buffersize; i++){
            if(charBuffer[i] == '$'){
                foundEnd = true;
                charBuffer[i] = '\0';
                dataFileLoc = ftell(dataFile)-(buffersize-i);
                break;//break to spare some time
            }
        }
        chapterBuffer.append(charBuffer);
    }
    fclose(dataFile);//done with the file for now.

    checkerTemp(chapterBuffer);

    return chapterBuffer;
}

結果は問題ないはずです。私はまだファイルの終わりに達したことがありません。そのため、そこで失敗する可能性があります。ただし、一見ランダムに見えます (一貫性がありますが、一見ランダムな場所にあります)。失敗すると、文字列にジャンク データ (8 文字相当) が挿入され、その後に通常のデータが再び挿入されます。

誰かがこれを引き起こす可能性のある考えを持っていますか、または誰かがこれを行うためのより適切なC++の方法を持っていますか? 文字列リーダーで何か?

前もって感謝します、

-Smileynator

4

2 に答える 2

3

C ファイル API を使用しています。C++ iostream API を使用する必要があります。

章を読むには、delimiter 引数としてstd::getlinewithを使用する必要があります。'$'これは、文字列オブジェクトが自動的に割り当てるため、バッファの割り当てについて心配する必要がないことを意味します。

ループも非常にシンプルになります。

while(std::getline(strm, str, '$').good())
    do_something_with_chapter(str);
于 2013-03-19T13:29:25.173 に答える
2

1 つのエラーは、while ループがループする場合、ステートメントが次のようになることです。

chapterBuffer.append(charBuffer);

終了していない文字バッファーを chapterBuffer に追加しようとしていますが、これは良いことではありません。「$」が見つかったかどうかにかかわらず、for ループ内で維持する必要があります。そうでない場合は、charBuffer を終了する必要があります。または、charBuffer に buffersize + 1 バイトを割り当て、ループの前に charBuffer[buffersize] = '\0' を設定できます。

于 2013-03-19T13:00:56.533 に答える