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++ 新手,所以我不确定解决这个问题的最佳方法是什么。

我如何阅读一行并知道什么样的指令?

我想知道一些想法

(我的哈希表代码在这里http://pastebin.com/yVEeqvzG

4

2 回答 2

1

由于您的作业的主要目标是哈希表部分,您可能想要进行快速而肮脏的 hack 来解析您的文件,这样您就可以快速开始主要部分。

以下是用 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

这个基本片段能够逐行加载文件。如何管理解析是你的职责,我会去,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 回答