【问题标题】:Go to a specific line in file and read it转到文件中的特定行并阅读它
【发布时间】:2015-09-24 16:47:55
【问题描述】:

问题描述

我有一个包含一组行的文件。一个

文件 1:

"Hello How are you"

"The cat ate the mouse"

基于用户输入的行的开头和结尾。我想转到文件中的每一行并提取它。

例如,如果用户输入 117 ,那么我必须转到 1 行,其大小为 17 字符。他可以给出文件中的任何行号。

我阅读了以下答复Read from a specific spot in a file C++。但我真的不明白。为什么线的大小必须相同?如果我有关于文件中每一行的开头和结尾的信息。为什么不能直接访问?


源代码

我尝试使用受Read Data From Specified Position in File Using Seekg 启发的以下代码,但为什么无法提取行?

    #include <fstream>
    #include <iostream>

    using namespace std::

    void getline(int, int, const ifstream & );
    int main()
    {
      //open file1 containing the sentences
      ifstream file1("file1.txt");

      int beg = 1;
      int end = 17;
      getline(beg,end, file1);

      beg = 2;
      end = 20;
      getline(beg,end, file1);

      return 0;
    }

void getline(int beg, int end, const ifstream & file)
{
   file.seekg(beg, ios::beg); 
   int length = end;

   char * buffer = new char [length];

   file.read (buffer,length);

   buffer [length - 1] = '\0'; 

   cout.write (buffer,length);
   delete[] buffer;
}

【问题讨论】:

  • 删除using namespace std::(不会编译顺便说一句,我怀疑在你的真实代码中你有using namespace std;)。
  • 所以第一个数字告诉您要在文件中读取哪一行,第二个数字告诉您要从该行读取多少个字符?您当前代码的结果是什么?运行时会发生什么?
  • "如果我有关于文件中每一行的开头和结尾的信息" 那么是的,可以直接查找任意行。但是您的代码并未显示您拥有该信息。
  • 额外提示:您将无法从 const fstream 中读取。如果您的编译器允许这样做并为您构建可执行文件,请获取一个新的编译器。

标签: c++ file fread seekg


【解决方案1】:

此代码似乎使用行号作为字节偏移量。如果您寻求偏移“1”,则文件将向前寻找 1 个字节,而不是 1 行。如果您寻求偏移 2,文件将向前搜索 2 个字节,而不是 2 行。

要查找特定行,您需要读取文件并计算换行符的数量,直到找到所需的行。有代码已经这样做了,例如std::getline()。如果您还不知道您想要的行的确切 byte 偏移量,您可以调用std::getline() 的次数等于您想要的行号。

还要记住文件的第一个字节是偏移量 0 而不是偏移量 1,并且不同的平台使用不同的字节来指示行尾(例如,在 Windows 上是 "\r\n",在 Unix 上是 "\n") .如果您使用库函数读取行,则应为您处理行尾。

【讨论】:

  • 谢谢@Alice Asker。我所做的是,我没有使用行号,而是使用了字节。对于每一行,我计算它的长度 + '\0'。下一行从第 1 行加 1 的末尾开始。它现在运行良好。很好的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2020-03-23
相关资源
最近更新 更多