从特定位置获取文件内容到另一个特定位置

时间:2013-08-02 05:20:44

标签: c++ file

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

我正在使用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.

3 个答案:

答案 0 :(得分:5)

由于您知道要从文件中读取的块的开头和结尾,因此可以使用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
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

首先你可以使用

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()?