C++ 从文件中计算特定拆分的字符串

C++ 从文件中计算特定拆分的字符串,c++,string,pattern-matching,fstream,C++,String,Pattern Matching,Fstream,我正在编辑这个问题,因为我已经解决了映射和拆分字符串的问题。现在我已经找到了如何在文件中查找特定字符串。但无法确定如何打印此特定字符串所在的所有行。例如,如果字符串t1(“Cap900”)出现在第5行和第7行中,我想将整行打印在另一行下方 ifstream f("test.txt"); string t1("Cap900"); istreambuf_iterator<char> eof; if(eof == search(istreambuf_iterator<char&g

我正在编辑这个问题,因为我已经解决了映射和拆分字符串的问题。现在我已经找到了如何在文件中查找特定字符串。但无法确定如何打印此特定字符串所在的所有行。例如,如果字符串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;
ifstream f(“test.txt”);
字符串t1(“Cap900”);
istreambuf_迭代器eof;
if(eof==search(istreambuf_迭代器(f),eof,t1.begin(),t1.end())

cout我不知道我读的是否正确,但看起来您正在尝试对文件中的所有行进行排序。如果是这样的话,我有一个建议

您熟悉std::map数据结构吗?如果Cap900之后的数据是您想要匹配的,那么您可以创建一个使用该字符串作为键的映射,方法是将该字符串散列为整数值(例如:使用您可以找到的散列),或者使用完整字符串作为散列,尽管我认为这可能较慢。大概是这样的:

// ... 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
  }
}
/。。。这里还有其他代码。。。
字符串原件;
getline(填充,原始,'\0');
int hash=functhathathashesastring(原始);
std::线图;
//在某个位置索引到地图将返回对向量的引用或创建一个空的新向量
线条图[hash]。推回(原始);
//之后,您可以使用这样的循环按顺序打印每一行
auto it=lineMap.begin();
对于(;it!=lineMap.end();++it)
{
for(无符号i=0;isecond.size();+i)
{
string strOriginal=it->second[i];
//然后,如果需要,将字符串打印到新文件中
}
}

当然,这是添加整行,但是,在将数据用作哈希之前,您需要首先解析数据。我想你也应该在地图上加上完整的线条,而不仅仅是Cap900右边的数据。如果这对你有帮助,请告诉我

此外,我知道如何写入其他文件。主要的问题是我如何匹配从行到整个文档的特定字符串。在我完成第一行之后,如何跳到第二行,用它做同样的事情。tanx
用于在标记中引用,现在(一次)为您修复了此问题。谢谢我的错误:)下一步:首先阅读文档和您的书我非常感谢orbit的帮助。不,我不熟悉std::map。我想你希望我写FuncthashEsasString(原件),我会试试看,但时间有限,如果你能帮我解决这个问题,我会很感激,我相信我会自己做的,但截止日期会过去,没有任何用处。有很多散列函数。它们可能非常复杂,可能涉及大量的数学,所以我强烈建议只找到一个C++散列函数并将其复制到程序中,而不是自己编写。上面的函数中有一个哈希函数,您可以使用。您可以在该页中搜索“unsigned hash_str(const char*s)”以找到它。哈希函数将获取您的字符串并返回唯一的整数哈希。如果您使用了一个数组并希望按此数字对其进行索引,那么您需要一个大小至少为该哈希值加1的数组,并且您的数组将有大量未使用的空间!您可以将std::map想象为“稀疏数组”。它只存储所需的数据,不会浪费很多空间。因此,通过散列对映射进行索引将不需要至少为散列的索引,它将“映射”您的索引到一个首先进入其当前大小的索引(例如:293840可能映射到6,或者类似的东西)。