【问题标题】:In C++ is there a way to go to a specific line in a text file?在 C++ 中有没有办法转到文本文件中的特定行?
【发布时间】:2011-07-09 14:48:33
【问题描述】:

如果我使用 fstream 打开一个文本文件,是否有一种简单的方法可以跳转到特定的行,例如第 8 行?

【问题讨论】:

  • 是的,如果所有行的长度完全相同。
  • 是的,阅读 7 行。不,如果行不是以字节为单位的固定长度,则不能跳转。

标签: c++ fstream


【解决方案1】:

绕到那里。

#include <fstream>
#include <limits>

std::fstream& GotoLine(std::fstream& file, unsigned int num){
    file.seekg(std::ios::beg);
    for(int i=0; i < num - 1; ++i){
        file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    return file;
}

file 的查找指针设置为num 行的开头。

测试具有以下内容的文件:

1
2
3
4
5
6
7
8
9
10

测试程序:

int main(){
    using namespace std;
    fstream file("bla.txt");

    GotoLine(file, 8);

    string line8;
    file >> line8;

    cout << line8;
    cin.get();
    return 0;
}

输出:8

【讨论】:

  • 这是唯一的方法吗?我们必须遍历每一行(即搜索'\n',去那里,搜索下一个等等)只是为了将指针移动到特定的行?没有更快的解决方案吗?
【解决方案2】:

如果每一行的长度相同,那么您可以使用 istream::seekg() 跳转到该位置并从那里读取。

【讨论】:

    【解决方案3】:

    如果行的长度相同,这是一个使用std::getline() 的工作且简洁的示例:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    const int LINE = 4;
    
    int main() {
    std::ifstream f("FILE.txt");
    std::string s;
    
    for (int i = 1; i <= LINE; i++)
            std::getline(f, s);
    
    std::cout << s;
    return 0;
    }
    

    【讨论】:

    • 1.您可能不需要将LENGTH 留在那里。 2.getline(src, str)这里有点太浪费了,我觉得。
    • 谢谢!我编辑了帖子。我提出了一种使用getline 的替代方法。它可能不是性能最好的。
    • 实际上,我的意思是 LENGTH 不是一个约束。您那里的代码不需要 需要知道行的长度(不需要“具有相同的长度”)。现在添加它可能不是一个好主意,虽然^^'
    • 是的,第一次就知道了。我删除了长度,谢谢!
    【解决方案4】:

    一般来说,,你必须使用类似于Xeo shows的策略走下去。

    如果netrom says 你知道行有固定长度,是的

    即使事先不知道行长,但 (1) 你会想要跳来跳去, (2) 你可以保证同时没有人在弄乱你的文件可以通过一次来形成一个索引,然后再使用它。

    【讨论】:

    • ... 为什么要链接到同一个问题? "you know the lines have fixed length, yes"
    • 我们真的需要这些无关链接来回答同一个问题吗?它们根本没有帮助。
    • @muntoo:自测试版以来,我一直习惯于在重复扩展问题时链接到问题的早期答案。我承认第二个的表述草率且不清楚。
    • 问题是人们希望 SO 上的链接引用相关但不同的问题/答案。您的答案是一个摘要聚合器,其中包含一个原始内容的句子,作为对 netrom 答案的评论会更好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多