gpt4 book ai didi

c++ - 设置文件指针位置

转载 作者:行者123 更新时间:2023-11-30 02:36:46 26 4
gpt4 key购买 nike

  • 我有一个非常大的文本文件,其中包含许多按行排列的条目。
  • 每一行的第一个词对我来说就像一把“ key ”。该行的其他词是数字。
  • 一行的第一个词也可以存在于其他大量的行中。

例如,考虑如下文件样本:

Associative 19 78 45 23 
Disjunctive 23 45 02 200
Associative 23 546 32 56
Conjunctive 22 22 00 3478
Disjunctive 11 934 88 34

我的目标:

对所有“关联词”、“分离词”和“连词”执行一组特定的操作。文件很大,没有排序。我可以使用 bash 执行额外的排序操作,但只考虑我想避免它的情况。

我的方法:

Step 1 : Open the file using **std::ifstream**
Step 2 : Create an unordered set to store the unique first words.
Step 3 : Create a multimap of type multimap<std::string,streampos>
Step 4 : Traverse the file using std::ifstream::ignore, and keep adding the first word to the unordered set, and stream position to the multimap alongwith the first word.
Step 5 : The thought is that in this way a primary index of stream position and line numbers is being created.
Step 6 : Now go through each element of the unordered set and use multimap::equal_range to look for stream positions for that key.
Step 7 : Traverse through those stream positions and do your operation

Q1。这种使用 C++ 从文件中读取特定行的方法是否正确?

Q2。以下是我为测试这个想法而编写的 C++ 程序的基本片段。但是我没有找到成功的想法。该程序已完成。您可以简单地复制和粘贴代码并使用上面的文本文件示例来查看输出。具体问题如下:当我使用 seekg 设置流位置然后尝试读取一行时,似乎没有任何反应(即流位置没有改变)。代码片段如下:

#include<iostream>
#include<fstream>
#include<limits>
#include<unordered_set>
#include<map>
using namespace std;
int main(int argc,char* argv[])
{
if (argc<2)
{
cout<<"Usage: get_negatives <Full Path of Annotation File> \n"<<endl;
return 0;
}

ifstream fileGT;
fileGT.open(argv[1]);//Open the file containing groundtruth annotations
string filename;
unordered_set<string> unique_files; //Open this unordered set to uniquely store the file names
multimap<string,streampos> file_lines; //Open this multimap to store the file names as keys and corresponding line numbers as the values
streampos filepos = fileGT.tellg();
fileGT>>filename;
unique_files.insert(filename);
file_lines.insert(pair<string,streampos>(filename,filepos));
while(!fileGT.eof())
{
fileGT.ignore(numeric_limits<streamsize>::max(),'\n');
filepos = fileGT.tellg();
fileGT>>filename;
unique_files.insert(filename);
file_lines.insert(pair<string,streampos >(filename,filepos));
}

for(auto it=unique_files.begin(); it!=unique_files.end(); ++it)
{
pair<multimap<string,streampos>::iterator, multimap<string,streampos>::iterator>range_vals;
range_vals = file_lines.equal_range(*it);
for(auto it2=range_vals.first; it2!=range_vals.second; ++it2)
{
fileGT.seekg(it2->second,ios_base::beg);
getline(fileGT,filename);
cout<<filename<<endl;
}
}


return -1;

}

最佳答案

问题是如果设置了一些错误位,seekg() 有时无法正常工作。

您必须始终在每个 fileGT.seekg() 之前调用 fileGT.clear()。我认为这应该是 C++11 中的默认模式,但我不会打赌。

此外,在每次读取后检查错误是个好主意:

if (!getline(fileGT, filename))
//error handling

而且,正如我在评论中所说,如果您要四处寻找,则必须使用 std::ios::binary 打开文件。

关于c++ - 设置文件指针位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com