【问题标题】:count a specific splited string from a file从文件中计算特定的拆分字符串
【发布时间】:2015-05-25 19:22:07
【问题描述】:

我正在编辑问题,因为我已经解决了映射和拆分字符串的问题。现在我找到了如何在文件中查找特定字符串。但无法弄清楚如何打印该特定字符串所在的所有行。例如,如果字符串 t1("Cap900") 出现在第 5 行和第 7 行中,我想将整行打印在彼此下方。

ifstream f("test.txt");

string t1("Cap900");

istreambuf_iterator<char> eof;
if(eof == search(istreambuf_iterator<char>(f), eof, t1.begin(), t1.end()) )
cout << "String \"" << t1 << "\" was NOT found in the file " << endl;
else
cout << "String \"" << t1 << "\" was found in the file " << endl;

【问题讨论】:

  • 此外,我知道如何写入其他文件。主要的是我如何将特定字符串从行匹配到整个文档。在我完成第一行之后如何跳到第二行并用它做同样的事情。坦克
  • &gt; 用于在标记中引用,现在为您修复此问题(一次)。
  • 感谢我的错误 :)
  • 下一步:阅读文档和你的书

标签: c++ string pattern-matching fstream


【解决方案1】:

我不知道我是否正确阅读了这篇文章,但看起来您正在尝试对文件中的所有行进行排序。如果是这种情况,我有一个建议。

你熟悉 std::map 数据结构吗?如果 Cap900 之后的数据是您想要匹配的数据,您可以创建一个使用该字符串作为键的映射,通过将该字符串散列为整数值(例如:使用散列,您可以找到 here)或通过使用完整的字符串作为散列虽然我认为它可能会更慢。像这样的:

// ... other code up here ...
string original;
getline(inFile, original, '\0');

int hash = FuncThatHashesAString(original);

std::map<int, std::vector<string> > lineMap;

// indexing into the map at a location will either return a reference to a vector or create a new one that is empty
lineMap[hash].push_back(original);

// afterwards you can print out each line in order using a loop like this
auto it = lineMap.begin();
for(; it != lineMap.end(); ++it)
{
  for(unsigned i = 0; i < it->second.size(); ++i)
  {
    string strOriginal = it->second[i];
    // then print your string to a new file if you want
  }
}

当然,这是添加整行,但您需要先解析数据,然后再将其用作哈希。我认为您还希望将整行添加到地图中,而不仅仅是 Cap900 右侧的数据。如果这对您有帮助,请告诉我!

【讨论】:

  • 首先,我非常感谢orbit 的帮助。不,我不熟悉 std::map。我想你希望我写 FuncThatHashesAString(original) 我会试试看,但时间有限,如果你能帮我解决这个问题,我将不胜感激,我相信我会自己做,但截止日期会过去不会有用的。
  • 有很多散列函数。它们可能非常复杂并且可能涉及大量数学运算,因此我强烈建议您只找到一个 c++ 散列函数并将其复制到您的程序中,而不是自己编写。上面的link 中有一个哈希函数可以使用。您可以在该页面上搜索“unsigned hash_str(const char* s)”来找到它。
  • 哈希函数将获取您的字符串并返回一个唯一的整数哈希。如果您使用一个数组并希望通过该数字对其进行索引,则您需要一个大小至少为该哈希值加一的数组,并且您的数组将有很多未使用的空间!您可以将 std::map 想象为“稀疏数组”。它只存储它需要的数据,不会浪费很多空间。因此,通过您的哈希索引地图将不需要至少哈希的索引,它会将您的索引“映射”到第一个进入其当前大小的索引(例如:293840 可能映射到 6,或类似的东西)。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多