【问题标题】:Understanding pointers with file i/o in c++在 C++ 中理解带有文件 i/o 的指针
【发布时间】:2010-01-24 08:35:51
【问题描述】:

我试图更好地掌握指针。我的课堂作业是为原型void OpenFile(const char *fileName, ifstream &inFile) 创建函数。

 void OpenFile(const char *fileName, ifstream &inFile) 
 {
  inFile.open(FILENAME, ios_base::in);
  if (!inFile.is_open()) {
   cerr << "Could not open file " << fileName << "\n";
   exit(EXIT_FAILURE);
  }
  else {
   cout << "File Open successful";
  }
 }

 //FILENAME is defined as: const char * const FILENAME = "file.txt";

 // function is called in main with:  OpenFile(FILENAME, inFile);

我想我不明白的是 const char * 和两个参数的 &。我猜第一个参数是一个 const char *,因为这就是赋值定义 FILENAME 的方式。但是在这种情况下我必须使用指针吗?我可以做吗

    const char FILENAME = "file.txt";

在我的 OpenFile 中,第一个参数只需要一个 const char。再说一遍,为什么我的函数的第二个参数需要引用?对何时使用指针以及何时使用引用绝对感到困惑。谢谢!

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    首先,让我说如果你传入一个参数 fileName 但随后在其中使用 FILENAME 并且 fileName 仅用于错误输出,那么你的函数看起来有点奇怪。我想这不太正确。

    其次,关于 const char* 问题。 char 本身只是一个 char (字符),因此只有一个字符。 const char FILENAME = "file.txt" 因此不起作用。相反,您需要一个字符数组(const char FILENAME[] = ...),或者就像在 C 中所做的那样,使用指向文本内存位置的指针,即 char*。

    由于您似乎使用 STL,因此最好放弃 char* 并改为转换为 std::string。

    第三,指针与引用通常是个人喜好问题。最后,它们都做相同的事情,并且在编译器中它们实际上是相同的。使用上的一个区别是不能传递空(null)引用,但可以传递空指针。因此,如果您确实需要传递一个对象,建议通常是使用引用,以及任何可能是可选的指针(在这种情况下,您必须处理 ptr == NULL)。此外,作为 char* 的 C 字符串和其他手动分配的内存通常通过指针发送。

    【讨论】:

      【解决方案2】:

      const char*(或char const*)是一个指向不能修改(const)的字符(char)的指针。通常这意味着一个 C 风格的字符串,其中实际上有一个字符数组,并且指针指向第一个字符,并且在字符串的最后一个字符之后有一个 '\0' 字符,告诉程序字符串在那里结束.

      您可以执行 const char foo = 'a',在其中存储单个字符,但无法将字符串分配给 const char 变量,因为将数组(即 C 字符串)放入字符变量中不会没有意义。

      您也可以将指针用于第二个参数,但是当您不需要特定于指针的功能时,在 C++ 中使用引用是更好的样式。引用总是指向一个元素(而不是像指针那样的数组)并且它们总是指向某个地方(而不是像 NULL 指针那样无处可去)。它们也更容易使用,因为您可以使用引用变量,就像它指向的对象一样,您需要编写指针 (*ptr) 来访问指向的对象。

      在进行练习之前,您真正需要的是一些基本的 C++ 课程。阅读您的课本或其他材料上的指针和参考资料。我会链接到在线资料,但我不知道有什么足够好的。

      【讨论】:

      • 谢谢,一直在看,只是还不清楚。感谢您的帮助!
      【解决方案3】:
      • fileName 是传统的 C 字符串。您通过将指针传递给字符串的第一个字符来将字符串传递给函数。

      • inFile 是对 ifstream 变量的引用。因为它是通过引用传递的,所以您的函数可以修改它并将其返回给调用程序。在这种情况下,您的函数会打开文件并返回打开的文件变量。

      【讨论】:

        【解决方案4】:

        char 类型用于单个字符(例如 char example = 'e')。所以const char FILENAME = "file.txt" 不会编译。

        这是 C 字符串上的 nice tutorial

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 2010-10-14
          • 1970-01-01
          • 1970-01-01
          • 2018-05-20
          • 1970-01-01
          相关资源
          最近更新 更多