C ++:正确使用流操作

时间:2011-03-06 10:35:49

标签: c++

我正在努力学习如何正确使用文件流。以下是我正在维护的代码片段。它工作正常,但我想知道用法是否正确以及是否有更好的方法来执行这些任务。例如,使用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();

3 个答案:

答案 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);几乎肯定是一个错误。它将流输出指针设置为从流的开头开始的特定于实现的字节数。