gpt4 book ai didi

c++ - 如何恢复将数据附加到特定位置的文件? (std::ostream, streampos, tellp/seekp)

转载 作者:太空狗 更新时间:2023-10-29 21:30:10 26 4
gpt4 key购买 nike

我正在尝试将一些数据附加到文件中,但在某些情况下想要从末尾向后跳一点以覆盖文件的尾端。但是,seekp( pos )seekp( offset, relative ) 对我都没有任何影响(除了在使用负偏移量时提示)。我使用不当还是它们损坏了?

下面是一个小例子。编译器:gcc 版本 4.4.4 (Debian 4.4.4-6)

    #include <fstream>
#include <sstream>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost::posix_time;

int main(int nargs, char** pargs){
if( nargs < 2 || nargs > 3 ){
cerr<<"Usage: "<<pargs[0]<<" file [pos]"<<endl;
return 1;
}

const char* fname = pargs[1];
ofstream f( fname, ios::binary|ios::out|ios::ate );
if( !f.good() ){
cerr<<"Unable to open file!"<<endl;
return 1;
}

if( nargs == 3 ){
istringstream offss(pargs[2]);
streamoff off;
offss >> off;
cout <<"Seeking to: "<<off<<endl;
f.seekp( off, ios_base::end ); // using beg or cur instead doesn't help, nor does: seekp( off )
if( f.fail() ){
cerr<<"Unable to seek!"<<endl;
f.clear(); // clear error flags
}
}

f<<"[appending some data at "<<second_clock::local_time()<<"]\n";

return 0;
}

现在,如果我使用 0 偏移量进行查找,它应该将输出位置放在文件末尾并且写入应该追加,对吗?好吧,它对我没有影响(osf 之前不是空的):

> ./ostream_app_pos osf 0
Seeking to: 0
> cat osf
[appending some data at 2010-Jul-21 11:16:16]

通常的追加方式是使用ios::app。在这种情况下,追加有效,但尝试使用 neg/pos 偏移量查找无效,因为(来自 gcc doc):

ios::app Seek to end of file before each write.

我还尝试既不使用 ios::ate 也不使用 ios::app(大概是截断模式),达到与 ios::ate< 相同的效果.

很抱歉,如果这读起来更像是一个错误报告,但我想检查一下我在使用 seekp 时是否有什么错误,并了解它是否是特定于编译器的。

最佳答案

您需要打开具有输入和输出属性的文件。
以下代码没有通常的错误处理,只是为了说明一种技术。

#include <iostream>
#include <fstream>

int main()
{
const char *szFname = "c:\\tmp\\tmp.txt";
std::fstream fs(szFname,
std::fstream::binary |
std::fstream::in |
std::fstream::out);
fs.seekp(13, std::fstream::beg);
fs << "123456789";

return 0;
}

============================================= =

C:\Dvl\Tmp>type c:\tmp\tmp.txt
abdcefghijklmnopqrstuvwxyz
C:\Dvl\Tmp>Test.exe
C:\Dvl\Tmp>type c:\tmp\tmp.txt
abdcefghijklm123456789wxyz
C:\Dvl\Tmp>

关于c++ - 如何恢复将数据附加到特定位置的文件? (std::ostream, streampos, tellp/seekp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3297831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com