Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:正确使用流操作_C++ - Fatal编程技术网

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

C++ C++;:正确使用流操作,c++,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*)&t

我正在努力学习正确使用文件流。下面是我正在维护的一段代码。它工作得很好,但是我想知道这个用法是否正确,是否有更好的方法来执行这些任务。例如,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()方法。因此,将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
您刚刚开始,比如说从开始的2个字节开始,而您的文件在打开时可能有内容,也可能没有内容


关于ios::ate,它将用于读写的指针放在文件的末尾(如果需要,您必须使用seekp和seekg来实现相同的行为,而不是使用ios::ate)。

除了其他人编写的以外,您应该始终使用
操作符,
fout.seekp(sizeof(off),ios::beg)几乎肯定是一个错误。它将流输出指针设置为从流的开头开始的特定于实现的字节数。

我似乎记得C标准要求在查找和写入之间进行刷新或其他操作。阿尔夫:不,只需要在同一个流的输出和输入操作之间进行刷新,而只有在使用<代码> <代码>时才使用,而不是C++流。这两种方法都不适用于此。实际上,它是标准C++,但这仅仅是因为C兼容特性。实际上,iOS:BEG具有与SekKySeT相同的值的概率非常高。这不仅仅是巧合。@Bo:即使是这样,它在这里被用作偏移参数,而不是方向,这肯定是错误的。如果
SEEK\u SET
恰好为零,它将意外地工作。@DeadMG:使用流式操作符会产生不同的行为(转换为文本,而不是写入二进制表示)。这可能不是我们想要的。@Mike:他已经以二进制模式打开了流。应该以二进制形式输出。我想你指的是记录而不是寄存器?当然。对不起,太直译了。
fout.seekp(SEEK_SET,ios::beg);
ofstream fout(fpath,ios::out| ios::binary | ios::ate);
fout << test;
fout << temp;    
fout << o;
fout << l;    
fout.close();