gpt4 book ai didi

C++:流操作的正确使用

转载 作者:行者123 更新时间:2023-11-30 03:08:15 25 4
gpt4 key购买 nike

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

最佳答案

如果您尝试使用 的可能性来进行训练,那么代码就可以了。

如果您只是想写入一些数据,则不需要调用 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) .

关于C++:流操作的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209991/

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