早上好,
我正在尝试使用用g ++编译的C ++读取文件(g ++(Ubuntu 4.4.3-4ubuntu5)4.4.3)。 Tis编译并在MSVC 2008下工作
这里修剪的很多是我的代码:
#include <iostream>
#include <fstream>
int main(int argc, char* argv[])
{
const char filename[] ("~/Serial.Number")
std::ifstream afile ( fileName );
if ( afile.is_open() )
{
// read input
afile.close();
}
}
我读过的所有内容都表明这足以使输入文件正常工作。当我写它(重复尝试)时,Eclipse游标“编译器”说'afile'是一个ifstream。然而在我编译它之后再次“overile”,我得到“不完整类型......”。
陌生人,当我运行程序时(调试模式)它运行,没有错误,没有抛出异常,但文件永远不会打开,并且.is_open()为false。
有什么想法吗?
韦斯
答案 0 :(得分:3)
Linux系统上很可能没有名为~\Serial.Number
的文件。它并不意味着您可能想要的(主目录下名为Serial.Number
的文件)。
Linux上的文件路径~\Serial.Number
在传递给open
系统调用或C ++文件流时,意味着文件名以波形符~
开头,后跟反斜杠{{ 1}}这是不太可能(即使原则上可能)存在。
您可能希望使用\
检索主目录,并将其连接到getenv("HOME")
字符串(以普通斜杠开头而不是反斜杠)。
问候。
答案 1 :(得分:1)
~
和\S
看起来对我很怀疑。正如@wilx所指出的,这只对shell而不是文件I / O方法有意义。使用用户的$HOME
环境变量构建完整路径:
std::string fullpath = getenv("HOME");
fullpath += "/Serial.Number";
...
答案 2 :(得分:1)
有一些问题:
~
可能无法达到预期效果。在Unix或Linux shell中使用它会引用您的主目录,因为shell会将其扩展到您的主目录,但是从应用程序代码中使用它会引用文字~
目录。\S
是一个特殊字符(就像\n
是换行符一样)。由于\S
特别是不是C和C ++转义字符之一,我很惊讶您的编译器没有抱怨。您应该为Windows转义反斜杠(即"~\\Serial.number"
),或者使用Linux的正斜杠("~/Serial.number"
)(也适用于Windows),或使用跨平台库(如{ {3}})将为您处理路径差异。