删除部分文本文件C ++

时间:2014-10-03 10:58:15

标签: c++ file input ofstream

我有一个名为copynumbers.txt的文本文件,我需要删除一些数字,然后使用Example将是一个包含以下内容的文本文件

   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15

每个整数应占用4个字节的空格。

我想删除或删除数字7到15,同时保持1到6然后将数字30添加到它。

所以那么文件将保持1到6并且摆脱7到15然后在那之后我想在30结束时。

我的新文件应该如下所示

1 2 3 4 5 6 30

我的问题是,如果不覆盖1到6号,我该怎么做? 因为当我使用

std::ofstream outfile;
outfile.open ("copynumbers.txt");

它将覆盖所有内容,并在文件中只留下30个

当我使用

ofstream outfile("copynumbers.txt", ios::app);

它只会在15之后附加30,但不会删除任何内容。

我的一些代码:

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ofstream outfile("copynumbers.txt", ios::app);

    outfile.seekp(0, outfile.end);

    int position = outfile.tellp();

    cout << position;

    //outfile.seekp(position - 35);

    outfile.seekp(28);
    outfile.write("  30",4);

    outfile.close();    

    return 0;
}

4 个答案:

答案 0 :(得分:3)

尝试“就地”修改文件通常是一个坏主意 - 如果出现任何问题,那么最终会导致文件损坏或丢失。通常你会做这样的事情:

  • 打开原始文件以进行输入
  • 为输出创建临时文件
  • 读取输入文件,处理,写入临时文件
  • 如果成功则:
    • 删除原始文件
    • 将临时文件重命名为原始文件名

除了作为更安全的策略之外,这使得修改内容的过程更容易,例如,从读取输入时跳过该部分的文件中“删除”某些内容(即只是不将该部分写入输出文件)。

答案 1 :(得分:1)

你必须使用seekp功能。看看这个。

http://www.cplusplus.com/reference/ostream/ostream/seekp/

答案 2 :(得分:1)

我建议在内存中读取原始文件,在内存中进行必要的更改,然后从头开始将所有内容写入文件。

答案 3 :(得分:1)

std::istream_iterator会帮助你吗? 如果你知道你只想要前6个单词,你可以这样做:

std::istringstream input( "   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15" );
std::vector< int > output( 7, 30 ); // initialize everything to 30

std::copy_n( std::istream_iterator< int >( input ), 6, output.begin() ); // Overwrite the first 6 characters

如果您希望输出选项卡分开,则可以对输出执行以下操作:

std::ofstream outfile( "copynumbers.txt" );

outfile << '\t';
std::copy( outfile.begin(), outfile.end(), std::ostream_iterator< int >( outfile, "\t" ) );