g ++ ifstream的不完整类型,存在正确的头文件

时间:2011-10-25 12:47:40

标签: c++ file-io

早上好,

我正在尝试使用用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。

有什么想法吗?

韦斯

3 个答案:

答案 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)

有一些问题:

  • 如果g ++成功编译代码,那么它(显然)能够解析必要的类型,即使Eclipse的C ++解析器由于某种原因不能。让Eclipse正确解析类型是一个单独的问题。
  • 在您的文件名中使用~可能无法达到预期效果。在Unix或Linux shell中使用它会引用您的主目录,因为shell会将其扩展到您的主目录,但是从应用程序代码中使用它会引用文字~目录。
  • 反斜杠是C和C ++转义字符。因此\S是一个特殊字符(就像\n是换行符一样)。由于\S特别是不是C和C ++转义字符之一,我很惊讶您的编译器没有抱怨。您应该为Windows转义反斜杠(即"~\\Serial.number"),或者使用Linux的正斜杠("~/Serial.number")(也适用于Windows),或使用跨平台库(如{ {3}})将为您处理路径差异。