0

このコードは、ファイルにインデックスを付け、各ファイル内の単語をトークン化する大きなコードの一部であるため、大量のファイルから特定の単語を検索できます。(グーグルのように)

この関数は、見つけたい単語をファイルで検索することになっています。しかし、私はそれがどのように機能するかを完全に理解していません!

誰かがこのコードが何をどのように行うのか説明してもらえますか?

さらに、いくつか質問があります。1) 「infile」とは正確には何ですか? 2) 組み込み関数 c_str() は何をしますか? 3) 変数「currentlineno」が 1 から始まるのはなぜですか? ファイルの最初の行が 0 から始まっていませんか? 4) ++x と x++ の違いは何ですか? 5) "currentlineno < lineNumber" と "currentlineno != lineNumber" の条件の違いは何ですか?

これはコードです:

void DisplayResult(string fileName, int lineNumber)
{
ifstream infile(fileName.c_str(), ifstream::in);

char line[1000];
int currentlineno = 1;

while(currentlineno < lineNumber) 
{
    infile.getline(line, 1000);
    ++currentlineno;
}
infile.getline(line, 1000);
cout<<endl<<"\nResult from ("<<fileName<<" ), line #"<<lineNumber<<": "<<endl;
cout<<"\t"<<line;

infile.close();
}
4

3 に答える 3

0

この機能は単語を検索しません。

入力としてファイル名と行番号を取ります。その行を見つけて読み取ろうとします。

出力は次の行で始まりfileNameますlineNumber。出力のこの 2 行目は不完全なままです (その後に改行がありません)。

ファイルの行数が要求された行数よりも少ない場合、または要求された行の前の行に 999 文字を超える行がある場合、見つかった内容は空です。要求された行が 999 文字を超える場合は、999 文字に切り捨てられます。

その他の質問:

1)infileは、自動保存期間とタイプ の関数スコープ オブジェクトでありstd::basic_ifstream<char, std::char_traits<char>>、 で指定されたファイルから読み取るために初期化されfileNameます。

2) 標準ライブラリの文字列クラスに組み込まれているメンバー関数 c_str() は、文字列の内容へのポインタを変更不可のヌル終端文字配列として返します。これは、C で通常文字列に使用される形式です (type const char *)。歴史的な理由から、ファイルベースの標準ライブラリ ストリームは、ファイル名引数をこの形式で受け取ります。

3) 人間は通常、行番号を 1 から数えます。lineNumberこれは、パラメーターに使用される規則です。使用するアルゴリズムはこれと一致する必要があります。ローカル変数は、「次にcurrentlineno読み取る行の番号」を意味するために使用されます。そのため、で初期化する必要があります1。(変数の名前を考えると、これはやや紛らわしいです。) 行カウンターを 0 で初期化する他の実装も可能です。実際、ほとんどの C++ プログラマーにとっては自然なことです。

4) C++ の教科書またはオンライン リファレンスを参照してください。++x「プレインクリメント」( ) および「ポストインクリメント」( x++) 演算子を探します。これらには同じ副作用 (x の増加) がありますが、式の値が異なります。結果を使用しない場合、それらは同等です (基本型の場合)。C++ プログラマーは通常、ユーザー定義型に対してより効率的に実装できる事前インクリメントを好みます。

5) さらに基本的な教科書の問題。a < b小なり関係のa != bテスト、不等式のテスト。

注: すべての回答は、使用されている型が標準 C++ ライブラリからのものであること、つまり、適切なインクルード<string><iostream>ヘッダー、および必要なusingディレクティブまたは宣言が使用されていることを前提としています。

于 2013-01-19T14:54:49.973 に答える
0

1)「infile」とは正確には何ですか?

ANS:: オブジェクトを構築し、オプションでファイルを開きます。リンク

2) 組み込み関数 c_str() は何をしますか?

ANS:: std::string クラス内に格納されたテキストの const char* 表現を取得するために必要です。リンク

3) 変数「currentlineno」が 1 から始まるのはなぜですか? ファイルの最初の行が 0 から始まっていませんか?

ANS:: 関数の 2 番目の入力パラメーターに依存しますDisplayResult

4) ++x と x++ の違いは何ですか?

ANS::これを参照してください。おそらく、Post-Increment と Pre-Increment について聞いたことがあるかもしれません。

5) "currentlineno < lineNumber" と "currentlineno != lineNumber" の条件の違いは何ですか?

ANS::の値は、条件がcurrentlinenoの場合の の値を超えてはなりません。の値は、の値を超える場合も下回る場合もありますが、 when condition がの値と同じであってはなりません。lineNumbercurrentlineno < lineNumbercurrentlinenolineNumberlineNumbercurrentlineno != lineNumber

于 2013-01-19T13:42:09.247 に答える
0

この関数は、パラメータによって渡された対応する行番号で行を表示します。

1/ Infile は、入力ストリームとしてファイルを開くことを許可します: http://www.cplusplus.com/reference/fstream/ifstream/

2/ c_str() は、文字列構造を単純な char* (char 配列) に渡すことを許可します。メソッド名が「c_str」である理由を説明する、C言語で使用する構造体です。C++ では通常、char* よりも string を使用します。

3/ なぜ currentlineno は 1 から始まるのですか? 関数は、指定された行番号の前にファイルの内容を読み取りました。を、もう一度読み込んで、必要な行を表示します。

4/ ++x はプリインクリメント、x++ はポストインクリメントです。++x を使用すると、使用する前に x がインクリメントされます。それ以外の場合、x++ を使用すると、後で x がインクリメントされます。

int x = 1;
cout << ++x; // display 2
x = 1;
cout << x++; // display 1

5/ オペレーターを見る : http://www.cplusplus.com/doc/tutorial/operators/

于 2013-01-19T13:47:49.417 に答える