【问题标题】:Simple file write function in C++ [duplicate]C ++中的简单文件写入功能[重复]
【发布时间】:2012-01-14 16:20:41
【问题描述】:

我有这个代码:

// basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    writeFile();
}

int writeFile () 
{
  ofstream myfile;
  myfile.open ("example.txt");
  myfile << "Writing this to a file.\n";
  myfile << "Writing this to a file.\n";
  myfile << "Writing this to a file.\n";
  myfile << "Writing this to a file.\n";
  myfile.close();
  return 0;
}

为什么这不起作用?它给了我错误:

1>------ Build started: Project: FileRead, Configuration: Debug Win32 ------
1>  file.cpp
1>e:\documents and settings\row\my documents\visual studio 2010\projects\fileread\fileread\file.cpp(8): error C3861: 'writeFile': identifier not found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这只是一个简单的功能。我正在使用 Visual Studio 2010。

【问题讨论】:

    标签: c++


    【解决方案1】:

    对此有两种解决方案。您可以将方法放在调用它的方法之上:

    // basic file operations
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int writeFile () 
    {
      ofstream myfile;
      myfile.open ("example.txt");
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile.close();
      return 0;
    }
    
    int main()
    {
        writeFile();
    }
    

    或者声明一个原型:

    // basic file operations
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int writeFile();
    
    int main()
    {
        writeFile();
    }
    
    int writeFile () 
    {
      ofstream myfile;
      myfile.open ("example.txt");
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile << "Writing this to a file.\n";
      myfile.close();
      return 0;
    }
    

    【讨论】:

    • 我明白了,有这么多语言,所以它不是 public static void main()public void functionName() ...嗯很有趣...把 main() 放在最后的那部分很有趣
    • 为什么把main函数放在最后会很“搞笑”? public static void main() 到底是什么?这跟什么有什么关系?
    • @Row Minds 这里的基本思想是,当您从 main 调用 writeFile() 时,尚未声明函数 writeFile,因此上述解决方案。
    • 如果我不得不猜测,我会说它之所以有趣,是因为它是 20XX,我们仍在使用一种无​​法解析声明的语言,然后在单独的扫描中读取定义。我不觉得这很搞笑,因为我明白为什么它不可能是其他方式。我只是哭泣。
    • @Juran:我想你的意思是myfile &lt;&lt; var &lt;&lt; "\n"; 那会起作用。
    【解决方案2】:

    您的main 不知道writeFile() 并且无法调用它。

    writefile 移动到main 之前,或者在main 之前声明function prototype int writeFile();

    【讨论】:

      【解决方案3】:

      在实际使用之前,您需要声明writeFile 函数的原型

      int writeFile( void );
      
      int main( void )
      {
         ...
      

      【讨论】:

      • 我明白了,有这么多语言,所以它不是 public static void main()public void functionName() ...嗯,有趣
      • 这些是函数,而不是方法(类成员函数)。所以这里没有public 的概念。 static 可用于函数,这意味着它将是文件私有的。请注意,您当然不能对 main 执行此操作。
      • 没有公共概念? public: 和 private: 怎么样?
      • 这些说明符只能在 C++ 中的类内部应用。在这里,您没有课程。只是函数,在顶层。
      • @RowMinds:与 Java 和 C# 相比,这很奇怪。如果您来自更程序化的语言,那么 main 是 publicstatic 的概念绝对是陌生的。
      【解决方案4】:

      这是C++有一个奇怪规则的地方。在能够编译对函数的调用之前,编译器必须知道函数名、返回值和所有参数。 这可以通过添加“原型”来完成。在您的情况下,这仅意味着在 main 之前添加以下行:

      int writeFile();
      

      这告诉编译器存在一个名为 writeFile 的函数,该函数将在某处定义,返回一个 int 并且不接受任何参数。

      或者,您可以先定义函数writeFile,然后定义main,因为在这种情况下,当编译器到达main 时,已经知道您的函数。

      请注意,事先知道被调用函数的要求并不总是适用。例如对于内联定义的类成员,它不是必需的......

      struct Foo {
          void bar() {
              if (baz() != 99) {
                  std::cout << "Hey!";
              }
          }
      
          int baz() {
              return 42;
          }
      };
      

      在这种情况下,编译器分析bar 的定义没有问题,即使它依赖于稍后在源代码中声明的函数baz

      【讨论】:

      • @RowMinds:C++ 不是干净的白页设计的结果,而是来自甚至通过了一个委员会的悠久的进化历史(仅这一点就可以从 任何东西)。不幸的是,在许多地方,结果非常令人惊讶且显然不合逻辑……这也意味着在学习 C++ 时您不能相信自己的直觉,而必须学习它。它是一种很好的强大语言,但它充满了奇怪的规则(通常只是出于历史原因而存在)。
      • @RowMinds:C++ 是一种低级语言,主要的设计选择之一是保持与金属足够接近,以便为汇编程序之上的另一种语言留下空间。许多人认为 C++ 在这方面失败了(因为通常使用 C 而不是 C++ 用于较低级别的部分),但这个决定仍然影响了大部分设计。 C# 是一种高级语言,因此将两者进行比较并没有什么意义……它们每个人都在某些方面做得更好;如果你只需要 C# 擅长的东西,那就选择 C#。
      【解决方案5】:

      函数声明 int writeFile() ;代码中似乎缺少。 添加 int writeFile() ;在函数 main() 之前

      【讨论】:

        【解决方案6】:

        切换函数的顺序或对 writefiles 函数进行前向声明,我认为它会起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多