0

宿題があります。衝突を解決するには、ハッシュ テーブルを作成し、リンク リストを使用する必要があります。ハッシュテーブルは非常にうまく機能しています。割り当ての一部は、ファイルを読み取り、内容を解析して命令を取得することです。

ファイルの内容:

Load("Via Lactea", "Galaxia")

Load("Galaxia", "Sistema Solar", "Sol")

Load("Via Lactea", "Hoyo negro", "001")

Find("Via Lactea","Luna")

Delete("Via Lactea","Jupiter")

Show()

私の質問は、ファイルの内容を読み取り、プログラムを操作するための命令を解析する C/C++ プログラムを作成する最良の (そして最も簡単な) 方法は何ですか。私は C/C++ が初めてなので、これを解決する最善の方法がわかりません。

1 行を読んで、どのような命令かを知るにはどうすればよいですか?

アイデアをいくつか知りたい

(私のハッシュテーブル コードはこちらhttp://pastebin.com/yVEeqvzG )

4

2 に答える 2

1

割り当ての主な目的はハッシュテーブル部分であるため、ファイルを解析する手っ取り早いハックを作成して、主要部分からすばやく開始できるようにすることをお勧めします。

以下はCで書かれていますが、C++でも動作します。

char line[100], command[100], word1[100], word2[100], word3[100];
FILE* f = fopen("whatever", "rt");

while (fgets(line, sizeof(line), f)) // read one line of text from file
{
    // The following is a format string for scanf.
    // It matches an opening quote, some text, and a closing quote.
    #define WORD "\"%[^\"]\""

    // Try to parse the line of text, applying all possible patterns.
    if (sscanf(line, "Load("WORD", "WORD", "WORD")\n", word1, word2, word3) == 3)
    {
        ...
    }
    else if (sscanf(line, "Load("WORD", "WORD")\n", word1, word2) == 2)
    {
        ...
    }
    else if (sscanf(line, "Find("WORD", "WORD")\n", word1, word2) == 2)
    {
        ...
    }
    else if (strcmp(line, "Show()\n") == 0)
    {
        ...
    }
}

必須の注意:この使用法にsscanf はセキュリティホールがありますが、おそらく気にしないでしょう。

于 2013-03-18T09:51:32.943 に答える
0

この基本的なスニペットは、ファイルを1行ずつロードできます。解析を管理する方法はあなたの義務です。私は一緒に行きstrtok_sますが、スペースのトリミング、適切な量のパラメーターのチェック、文字列からの二重引用符の抽出などに注意する必要があります。

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  filebuf fb;
  fb.open("data.txt",ios::in);
  istream is(&fb);
  char buffer[256];

  while ((is.rdstate() & ifstream::eofbit) == 0) {
    is.getline(buffer,256);

    // handle your parsing here
  }

  fb.close();
  return 0;
}
于 2012-04-19T20:07:19.017 に答える