【问题标题】:My ifstream doesn't seem to be working我的 ifstream 似乎没有工作
【发布时间】:2011-06-10 19:14:32
【问题描述】:

这是我在实现方法之前用来测试方法的主文件。我正在尝试获取目录中所有文件的列表,将它们写入 txt 文件(直到这里都可以正常工作),然后从该文本文件中读取文件名。

using namespace std;

string sysCall = "", location = "~/Documents/filenames.txt";
string temp = "";
sysCall = "ls / > "+location;
system(sysCall.c_str());

ifstream allfiles(location.c_str());
allfiles.good();
getline(allfiles, temp);
cout<<temp<<endl;  //At this point, the value of temp is equal to ""

return -1;

程序运行后,没有任何文字输出。从我在其他人的问题中读到的内容来看,这应该有效(但显然无效)。我在这里做错了什么?

编辑:allfiles.good() 返回 false,但我不明白为什么它会返回...

【问题讨论】:

  • 文件~/Documents/filenames.txt在您运行程序后是否包含预期的文件列表,即是否只有读取出错?
  • 另外,像这样单独调用allfiles.good() 并没有任何作用。您应该检查allfiles.good() 是返回true 还是false。如果是false,说明文件打开不正确,文件名有问题。
  • 是的,filenames.txt 文件包含预期文件名的列表。只有阅读它们才是问题

标签: c++ ifstream getline system-calls


【解决方案1】:

ifstream allfiles("~/Documents/filenames.txt"); 不会做你认为的那样。波浪号~ 字符不是文件名的一部分——它是一些shell 解释的特殊字符。您需要完整的路径,其中没有 ~$ 字符。

尝试将location 设置为"/tmp/filenames.txt",或者只设置"filenames.txt"

另外,如果您可以使用Boost.Filesystem,您可以使用directory_iterator 而不是调用/bin/ls

【讨论】:

  • 确实如此。他应该把它改成/home/userame/Documents/filenames.txt
【解决方案2】:

我敢打赌system() 调用会将文件名中的~ 扩展到您的主目录(例如/home/mrswmmr),但ifstream 不会。将 ~ 替换为您的主目录的完整路径,它应该可以工作。

【讨论】:

  • 这就是我的系统上发生的事情。
【解决方案3】:

它不能保证工作,因为system 不保证。

【讨论】:

  • 系统调用工作正常,它写入文本文件就好了。是 ifstream 和 getline 不起作用
  • 只是出于好奇,“不保证”到底是什么意思?如果system()调用返回0,是否不能保证命令已经执行并退出,返回码为0?
  • @HighCommander4 对于system 的规范,C++ 标准遵循 C。不幸的是,我无权访问 C 标准的副本。然而,从 C99 草案(我没有理由相信这从 C89 改变):“信息可以通过两种方式从被调用程序返回:通过实现定义的返回值 [...]”。因此,当参数为非 null 时始终返回 42 的实现是符合要求的。 (sn-p 中提到的另一种方式是关于文件。)
  • 对于传递给system 的参数,我没有引用,因为保证有些分散。但是程序能够查询system 是否表现良好:如果system(0) 为真,那么这意味着system 将理解命令。所以这是唯一的保证。
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2013-11-25
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多