矢量读取特定行

Posted

技术标签:

【中文标题】矢量读取特定行【英文标题】:vector read specific lines 【发布时间】:2012-09-08 05:33:04 【问题描述】:

我有一个文本文件,其中包含节目名称和出演者的名称。

我需要在一个类中创建一个向量,我可以在其中输入演员并输出电影。

但我不想将整个条目读入向量中以节省内存。

我怎样才能做到这一点,以便我可以阅读包含以下内容的 txt 文件,然后找到演员姓名,例如 Min, Jun So 它会找到这两个实例,然后将两部电影读入向量并输出它?

也许一个可以做到这一点的代码布局会很棒。只是为了让我开始。

Min, Elia
    Starlight Inn (2010)  [Skyler]  <4>

Min, Jun So
    "Joseon X-Files - Secret Book" (2010) Ghosts of Yidu (#1.6)  [Choi Eui Shin]  <5>

Min, Jung So
    "Mischievous Kiss" (2010)  [Oh Ha Ni]

Min, Xiao
    Little Sister (2010)  [Mei Mei]  <2>

【问题讨论】:

您确定要在选择所需行之前阅读整个文件吗?您可以遍历文件,即时找到这些行。您还可以解释这个问题与your last one 的关系。 我只是不确定如何编码。那是我的问题。 那个文件有多大?扫描文件比将所有名称放入 std::map 并使用它进行搜索要慢很多 我无法将整个文件加载到内存中。这就是问题所在。该文件为 15mb 你知道如何读取整个文件并逐行打印出来,而不是一次在内存中保存超过几行吗? 【参考方案1】:

试试这个示例代码:

#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()

    std::ifstream file( "test.txt" ) ;
    std::string search_str = "Elia" ;
    std::string line ;
    int line_number = 0 ;
    std::vector<string> finds;
    finds.resize(100);

    while( std::getline( file, line ) )
    
        ++line_number ;
        if( line.find(search_str) != std::string::npos )
        
            std::cout << "line " << line_number << ": " << line << '\n' ;
            finds.push_back(line);
            std::getline( file, line );
            finds.push_back(line);
        
    

    for (int i=0;i<finds.size();i++)
    
        std::cout<<finds[i]<<"\n";
    

    return 0;

输入:Elia

输出:

Min, Elia
    Starlight Inn (2010)  [Skyler]  <4>
Press any key to continue

【讨论】:

为什么是finds.resize(100)?也许你的意思是finds.reserve(100) resize() 分配内存并创建所需数量的实例但是 reserve() 只分配内存,它不创建实例。 当你想要索引向量时通常使用resize,如果你将使用push_back(后者自己在向量内创建实例),则通常使用reserve。现在前面有 100 个无用的空字符串,只是在打印出向量时看不到它们。

以上是关于矢量读取特定行的主要内容,如果未能解决你的问题,请参考以下文章

将大矢量图像转换为二进制矩阵的快速方法

有效地矢量化图像块处理?

在 GCC 的函数中禁用特定循环的自动矢量化

地理空间云怎么找矢量图

用渐变(或纯色)填充特定的可绘制矢量

C#读取矢量栅格文件