【问题标题】:Use of `ofstream` appears not to create nor write to file使用“ofstream”似乎不会创建或写入文件
【发布时间】:2012-04-04 20:56:57
【问题描述】:

在模拟结束时,我想将一些结果作为附加行写入数据文件。我使用的代码如下,您可以假设outFile 被正确分配为std::ofstreamoutput_file 是一个std::string,其中包含一个尚不存在的文件的有效路径,并且打印到文件中的变量只是int 在模拟期间获取值的类型。

outFile.open(output_file.c_str(), std::ios::out | std::ios::app );
outFile << num_nodes << ", " << tot_s << ", " << tot_c << ", " << tot_d << std::endl;
outFile.close();

我检查了它是否使用ofstream::is_open() 函数正确打开文件并返回false。但是,我不知道为什么。我已经尝试了许多不同的文件名和目录路径,所有这些我都检查过并且它们都是有效的(没有拼写错误等)

正在写入的文件只是在桌面上的一个文件夹中,我一直在该文件夹中创建文件,所以我看不出它怎么可能是权限问题。如果是权限问题,我该如何检查?

否则,还有什么可以阻止它写入文件?

添加:

跟进 cmets,在添加对 perror() 的调用后,它显示“没有此类文件或目录”错误。有问题的文件路径是:

/home/ely/Desktop/Evolutionary_Dynamics/GamesOnCycle/data/test.data

我希望创建此文件,并且该路径中的所有目录都存在,拼写正确等等,并且 GamesOnCycle 文件夹或其数据子文件夹没有奇怪的权限问题。请注意,它是一个 linux 系统(Ubuntu 11.04),因此正斜杠对于文件路径是正确的,除非我遗漏了 C++ 必须具备的东西。文件路径。

【问题讨论】:

  • 虽然 perror() 是 c 风格的你仍然可以在 ofstream.open 之后使用它来获取错误信息。
  • 您确定路径使用双反斜杠吗?
  • 您是否通过在打开时输出output_file.c_str() 来确保它是一致的?可能发生了意想不到的变化。
  • 路径中的所有目录都存在吗?我不确定ofstream 是否会创建不存在的目录。
  • 确实存在所有目录,但@chris 的建议是正确的。在从用户输入分配字符串时,我无意中使用了语法std::string output_file = ...,但在此之前我已经声明了变量std::string output_file。不知何故,编译器没有抱怨重新声明,并且不知何故这导致了一个空文件名。

标签: c++ file-io ofstream


【解决方案1】:

这可能是由于多种原因而发生的。

1) 文件已打开。

2) 文件路径中的所有目录都没有创建。

3) 缺少文件权限。

如需其他参考,请参阅When will ofstream::open fail?

【讨论】:

  • ofstream 只是默默地什么都不做,一旦路径上的目录不存在。
【解决方案2】:

这听起来可能很糟糕,但是您使用的是 windows 还是 linux?如果是windows,对于您的文件路径,您是在字符串中用双“\”定义它,还是只有一个?如果只有一个,你并没有把角色放在你认为的道路上。为了安全起见,请使用“/”字符。

如果你有这个:

string pathname = "C:\Users\me\Desktop";

这不是一个有效的路径。您正在将“\U”、“\m”和“\D”转义到您的字符串中。你需要这个:

string pathname = "C:\\Users\\me\\Desktop";

string pathname = "C:/Users/me/Desktop";

“/”不是转义字符。

这在我看来很可能。

【讨论】:

  • 更新了帖子。我在 Ubuntu 上。
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多