作为较大程序的一部分,我的任务是读取输入文件的每一行,并将索引偏移量存储到每一行。稍后给出所有索引偏移量,我希望能够直接转到文件中的该位置并打印与该偏移量相对应的行。有人可以在以下代码中帮助我弄清楚我在做错什么。
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <stdio.h>
#include <string.h>
void create_index_info(ifstream& myFile, std::unordered_map<size_t, std::pair<std::streampos, size_t>>& map_index_start_end_pos)
{
size_t uiLength;
size_t uiCount = 0;
std::string line;
while (getline(myFile, line))
{
start_pos = myFile.tellg();
uiLength = strlen(line.c_str());
map_index_start_end_pos.emplace( uiCount, std::make_pair(start_pos, uiLength) );
uiCount++;
}
}
void print_index_info(ifstream& myFile, const std::unordered_map<size_t, std::pair<std::streampos, size_t>>& map_index_start_end_pos)
{
size_t uiLength;
for(auto it = map_index_start_end_pos.begin(); it != map_index_start_end_pos.end(); it++)
{
auto res = it->second;
myFile.clear();
myFile.seekg(res.first, ios::beg);
uiLength = res.second;
char* buffer = (char*)malloc(uiLength * sizeof(char));
myFile.read(buffer, uiLength);
for(size_t uiCount = 0; uiCount < uiLength; uiCount++)
{
std::cout<< buffer[uiCount];
}
std::cout<<"\n";
free(buffer);
buffer = NULL;
}
}
int main()
{
std::unordered_map<size_t, std::pair<std::streampos, size_t>> map_index_start_end_pos;
ifstream myFile("Filename.txt");
create_index_info(myFile, map_index_start_end_pos);
myFile.close();
ifstream myFile1("Filename.txt");
print_index_info(myFile1, map_index_start_end_pos);
myFile1.close();
return 0;
}
输入文本文件中的数据包含以下条目:
9 10 11
8 7 5
67 34 12 45 9
20
代码的理想输出应该与输入模数相同,直到要打印的行的顺序为止(我使用的是无序映射,因此输出的输出顺序不必与输入的顺序相同)。但是我的代码输出的是一些垃圾,大部分是\ x00形式的字符。有人可以帮我找出我的代码中的错误吗。
答案 0 :(得分:0)
getline
而不是 ignore
? ignore
更快,并且不分配内存。您可能正在寻找:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
std::istream& get_line_idx( std::istream& is, std::vector<std::streampos>& result )
{
for( std::streampos pos = is.tellg(); is.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); pos = is.tellg() )
result.push_back( pos );
return is;
}
void print( std::istream& is, std::vector<std::streampos>& pos )
{
for( auto curpos : pos )
{
std::string line;
is.seekg( curpos );
std::getline( is, line );
std::cout << line << std::endl;
}
}
int main()
{
std::vector<std::streampos> result;
{
std::ifstream is { "c:\\temp\\test.txt" };
if( !is )
return -1;
get_line_idx( is, result );
}
{
std::ifstream is { "c:\\temp\\test.txt" };
if( !is )
return -2;
print( is, result );
}
return 0;
}