我正在努力学习如何正确使用文件流。以下是我正在维护的代码片段。它工作正常,但我想知道用法是否正确以及是否有更好的方法来执行这些任务。例如,使用SEEK_SET和ios :: beg。另外,ios :: ate确实需要,因为下一次搜索是在文件的开头。
请你帮我纠正(简化)代码。
ofstream fout(fpath,ios::out| ios::binary | ios::ate);
fout.seekp(SEEK_SET,ios::beg);
fout.write((char*)&test,sizeof(test));
fout.seekp(sizeof(off_t),ios::beg);
fout.write((char*)&temp,sizeof(temp)); //temp is int
fout.seekp((sizeof(off_t)+ sizeof(int)),ios::beg);
fout.write((char*)o,sizeof(MyClass));
fout.seekp((sizeof(off_t)+ sizeof(int) + sizeof(MyClass)),ios::beg);
fout.write((char*)&l,sizeof(int));
fout.close();
答案 0 :(得分:2)
如果您正在尝试使用 stream 的可能性,出于培训目的,那么代码就可以了。
如果您只是尝试编写一些数据,则不需要 seekp()方法调用,因为写入指针将自动更新到上次写入的结尾。只有在需要在记录之间导航时才需要 seekp(),例如在数据库中。
ofstream fout(fpath,ios::out| ios::binary | ios::ate);
fout.write((char*)&test,sizeof(test));
fout.write((char*)&temp,sizeof(temp));
fout.write((char*)o,sizeof(MyClass));
fout.write((char*)&l,sizeof(int));
fout.close();
此代码可以正常工作。关于代码中的问题,您似乎将C库stdio与其 fseek()函数混合在一起,使用 seekp()和 seekg()< / em>方法。因此,将SEEK_SET作为调用 seekp()的第一个参数传递是非常有效的。在C中,你会写:
#include <cstdio>
//...
fseek( f, 5, SEEK_SET ); // from the beginning
fseek( f, -2, SEEK_CUR ); // from the current position
fseek( f, 2, SEEK_CUR ); // from the current position
fseek( f, -2, SEEK_END ); // from the end of the file
SEEK_SET将有一个int值(特定于实现,比如说2),因此,你的行:
fout.seekp(SEEK_SET,ios::beg);
你刚刚开始说2个字节,而你的文件在打开时可能有或没有内容。
关于ios :: ate,它将读取和写入的指针放在文件的末尾(如果需要,你必须使用seekp和seekg来实现相同的行为,而不是使用ios :: ate)
答案 1 :(得分:1)
您应该尽可能使用operator<<
。
ofstream fout(fpath,ios::out| ios::binary | ios::ate);
fout << test;
fout << temp;
fout << o;
fout << l;
fout.close();
不确定你在寻求什么,所以我为了我的演示切割它们,但是如果你正在寻找新的写作位置那么它绝对没有必要。并且SEEK_SET
无法成为有效的C ++标准库常量 - 它们不使用该命名约定。
答案 2 :(得分:0)
除了别人写的内容之外,fout.seekp(sizeof(off_t),ios::beg);
几乎肯定是一个错误。它将流输出指针设置为从流的开头开始的特定于实现的字节数。