4

我想要通过指定位置的开始和指定位置的结束来获取文件内容的一部分。

我正在使用seekg函数来执行此操作,但该函数仅确定开始位置,但如何确定结束位置。

我做了代码来获取从特定位置到文件末尾的文件内容,并将每一行保存在数组项中。

ifstream file("accounts/11619.txt");
if(file != NULL){
   char *strChar[7];
   int count=0;
   file.seekg(22); // Here I have been determine the beginning position
   strChar[0] = new char[20];
   while(file.getline(strChar[count], 20)){
      count++;
      strChar[count] = new char[20];
}

例如
以下是文件内容:

11619.
Mark Zeek.
39.
beside Marten st.
2/8/2013.
0

我只想得到以下部分:

39.
beside Marten st.
2/8/2013.
4

3 回答 3

6

由于您知道要从文件中读取的块的开始和结束,因此可以使用ifstream::read().

std::ifstream file("accounts/11619.txt");
if(file.is_open())
{
    file.seekg(start);
    std::string s;
    s.resize(end - start);
    file.read(&s[0], end - start);
}

或者,如果您坚持使用裸指针并自己管理内存...

std::ifstream file("accounts/11619.txt");
if(file.is_open())
{
    file.seekg(start);
    char *s = new char[end - start + 1];
    file.read(s, end - start);
    s[end - start] = 0;

    // delete s somewhere
}
于 2013-08-02T05:44:17.820 回答
2

阅读fstream的参考资料。在seekg函数中,他们定义了一些ios_base你想要的东西。我想你正在寻找:

file.seekg(0,ios_base::end)

编辑:或者你想要这个?(直接取自tellg参考,稍作修改以读取我凭空抽出的随机块)。

// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {
  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    is.seekg(-5,ios_base::end); //go to 5 before the end
    int end = is.tellg(); //grab that index
    is.seekg(22); //go to 22nd position
    int begin = is.tellg(); //grab that index

    // allocate memory:
    char * buffer = new char [end-begin];

    // read data as a block:
    is.read (buffer,end-begin); //read everything from the 22nd position to 5 before the end

    is.close();

    // print content:
    std::cout.write (buffer,length);

    delete[] buffer;
  }

  return 0;
}
于 2013-08-02T05:36:04.453 回答
1

首先你可以使用

seekg()

设置阅读位置,然后你可以使用

read(buffer,length)

阅读意图。

例如,您要读取名为 test.txt 的文本文件中从第 6 个字符开始的 10 个字符,下面是一个示例。

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
std::ifstream is ("test.txt", std::ifstream::binary);
if(is)
{
is.seekg(0, is.end);
int length = is.tellg();
is.seekg(5, is.beg);

char * buffer = new char [length];

is.read(buffer, 10);

is.close();

cout << buffer << endl;

delete [] buffer;
}
return 0;
}

但在你的情况下,为什么不使用getline()?

于 2013-08-02T05:58:15.787 回答