我想确保已将一个ofstream写入磁盘设备.这样做的便携方式(可在POSIX系统上移植)是什么?
如果我open将文件分别以只读附加模式获取文件描述符并fsync用它调用,那么这是否解决了问题?像这样:
ofstream out(filename);
/* ...
write content into out
...
*/
out.close();
int fd = open(filename, O_APPEND);
fsync(fd);
close(fd);
Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以将输出缩进到ofstream对象?我有一个C++字符数组,它是null终止并包含换行符.我想将它输出到流中,但是用两个空格缩进每一行.有没有一种简单的方法可以使用流操纵器来执行此操作,例如您可以使用特殊指令更改整数输出的基础,或者我是否必须手动处理数组并在检测到的每个换行符时手动插入额外的空格?
看起来像string :: right()操纵器是关闭的:
http://www.cplusplus.com/reference/iostream/manipulators/right/
谢谢.
-威廉
我正在尝试将一个实现高分的游戏制作成.txt文件.我的问题是:当我发表如下声明:
ofstream fout("filename.txt");
Run Code Online (Sandbox Code Playgroud)
这是创建具有该名称的文件,还是只查找具有该名称的文件?
问题在于,每当我重新启动程序并做出以下声明时:
fout << score << endl << player;
Run Code Online (Sandbox Code Playgroud)
它会覆盖我之前的分数!
有没有办法让我这样做,以便在我写入文件时新分数不会覆盖旧分数?
这是我目前所拥有的:
void WriteHexToFile( std::ofstream &stream, void *ptr, int buflen, char *prefix )
{
unsigned char *buf = (unsigned char*)ptr;
for( int i = 0; i < buflen; ++i ) {
if( i % 16 == 0 ) {
stream << prefix;
}
stream << buf[i] << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过做stream.hex,stream.setf(std :: ios :: hex),以及搜索一下Google.我也尝试过:
stream << stream.hex << (int)buf[i] << ' ';
Run Code Online (Sandbox Code Playgroud)
但这似乎也不起作用.
以下是它当前生成的一些输出的示例:
Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í …Run Code Online (Sandbox Code Playgroud) 在ANSI C++中,如何将cout流分配给变量名?我想要做的是,如果用户指定了输出文件名,我在那里发送输出,否则,将其发送到屏幕.所以类似于:
ofstream outFile;
if (outFileRequested)
outFile.open("foo.txt", ios::out);
else
outFile = cout; // Will not compile because outFile does not have an
// assignment operator
outFile << "whatever" << endl;
Run Code Online (Sandbox Code Playgroud)
我也尝试将其作为宏函数:
#define OUTPUT outFileRequested?outFile:cout
OUTPUT << "whatever" << endl;
Run Code Online (Sandbox Code Playgroud)
但这也给了我一个编译器错误.
我想我可以为每个输出使用IF-THEN块,但是如果可以的话我想避免使用它.有任何想法吗?
我在MacOSX上.
在我的应用程序的记录器部分,我正在将数据转储到文件中.
假设我有一个全局声明 std::ofstream outFile("log");
在我的日志代码中我有:
outFile << "......." ;
outFile.flush();
Run Code Online (Sandbox Code Playgroud)
现在,假设我的代码在flush()发生后崩溃了; 是否保证写入磁盘outFile之前写入的东西flush()(请注意,我不会调用a close()).
谢谢!
如果我有std::ofstream可能打开或未打开的,是否可以安全地尝试close?在其他方面确实close()做任何讨厌(抛出异常等),如果!is_open().例如
std::ofstream out;
if (some_condition)
{
out.open(path, std::ios::out);
}
Run Code Online (Sandbox Code Playgroud)
完成文件后,我可以说
out.close();
Run Code Online (Sandbox Code Playgroud)
或者我应该先检查一下
if (out.is_open())
out.close();
Run Code Online (Sandbox Code Playgroud)
std::basic_fstream::close关于cppreference 的唯一描述是
关闭相关文件.
有效地打电话rdbuf()->close().如果在操作期间发生错误,setstate(failbit)则调用.
可能重复:
我需要关闭std :: fstream吗?
int main() {
ofstream a("a.txt");
a << "A" << endl;
//a.close();
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是不是必须在程序结束时关闭文件?
我有这个地图,在MSVC10中编译得很好:
std::map<std::string, std::ofstream> m_logFiles;
Run Code Online (Sandbox Code Playgroud)
但是在使用g ++ 4.5并启用了C++ 0x的ubuntu上,我收到以下错误消息:
/usr/include/c++/4.5/bits/ios_base.h| 785|error:'std :: ios_base :: ios_base(const std :: ios_base&)'是私有的
通过使用指针而不是对象,我解决了问题.
在网上搜索,我了解到流不是要复制的(为什么有很好的解释).但我的问题是,std :: ofstream是一个可移动的类型吗?如果是,它不应该允许它作为标准容器中的模板参数使用吗?
如果是,那么在这一点上g ++背后是MSVC10吗?(这可以解释为什么它适用于MSVC).我知道要求编译器编写者完全实现甚至不是最终的东西是愚蠢的,但我对未来感到好奇.
使用g ++ 4.6.1没有帮助.
编辑:阅读我进一步挖掘的评论,发现插入导致问题,而不是地图的声明.
阅读Cubbi的链接我尝试了以下内容:
#include <string>
#include <fstream>
#include <map>
using namespace std;
int main()
{
map<string, ofstream> m_logFiles;
ofstream st;
m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气.g ++抱怨使用b删除的拷贝构造函数.
有什么区别:
fstream texfile;
textfile.open("Test.txt");
Run Code Online (Sandbox Code Playgroud)
和
ofstream textfile;
textfile.open("Test.txt");
Run Code Online (Sandbox Code Playgroud)
他们的功能是一样的吗?