我有一个名为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;
}
答案 0 :(得分:3)
尝试“就地”修改文件通常是一个坏主意 - 如果出现任何问题,那么最终会导致文件损坏或丢失。通常你会做这样的事情:
除了作为更安全的策略之外,这使得修改内容的过程更容易,例如,从读取输入时跳过该部分的文件中“删除”某些内容(即只是不将该部分写入输出文件)。
答案 1 :(得分:1)
你必须使用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" ) );