c++ - 在 C++ 中创建动态文件指针

标签 c++ file new-operator

#include <QCoreApplication>
#include <stdio.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    FILE *fp;
    fp = new FILE [2];

    fp[0] = fopen ("temp.txt", "w");
    fp[1] = fopen ("temp.txt", "w");

    fputs ("What is your name?\n", fp[0]);
    fputs ("My name is XXX.\n", fp[1]);

    return a.exec();
}

我想使用 Qt 的功能,因此 Qt 包括在内。

错误是:

error: no match for 'operator=' (operand types are 'FILE {aka _IO_FILE}' and 'FILE* {aka _IO_FILE*}')
     fp[0] = fopen ("temp.txt", "w");
           ^

error: cannot convert 'FILE {aka _IO_FILE}' to 'FILE* {aka _IO_FILE*}' for argument '2' to 'int fputs(const char*, FILE*)'
     fputs ("What is your name?\n", fp[0]);
                                         ^

请让我了解这些错误的原因。

最佳答案

在 C 标准库中,stdio.hFILE 是所谓的“不透明类型”。基本上,您不知道,也不想知道 FILE 是什么、包含什么或解析成什么。这样做是为了便携性。相反,通过键入 FILE*,您可以通过指向 FILE 的指针来表示文件,无论 FILE 是什么。如果查看 stdio 库,您会发现所有 处理文件的函数都将 FILE* 作为参数,而不是一个 FILE。毕竟,您不应该永远自己创建一个FILE对象!

现在,你的代码...

FILE *fp;

声明 FILE* 类型的变量 fp

fp = new FILE [2];

将 2 个 FILE 的新数组的地址分配给 fp不好!您永远不应该自己操作FILE,而应该操作FILE*。所以,试试这个。

FILE *fp[2];

这将声明一个名为 fp 的包含两个 FILE 指针的数组。您的其余代码应该可以正常使用。碰巧你在这里不需要 new (那是用来在堆上分配的),而且很浪费。您甚至都没有删除它!如果您有 Java 背景,请阅读构造函数和 operator new 之间的区别,以便让您自己更清楚一些。

我希望这对您有所启发!

关于c++ - 在 C++ 中创建动态文件指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931958/

相关文章:

Android R 文件不是自动生成的

java - 为什么 fileWriter 在 bufferedWriter 和 printWriter 之前写入输出文件?

c++ - 分配数组时 operator new 的问题

javascript - QML 和 C++ 中的 Null 和 Undefined

actionscript-3 - 如何在actionscript3中异步获取文件修改日期

c++ - 使用 sed 从 C++ 代码中删除异常规范

c++ - 如何最好地在 C++ 中存储非常大的 2D float 列表?错误处理?

C++使用参数在数组中分配和构造对象

c++ - Windows 版本识别 [C/C++]

c++ - 不完整类型的 std::unique_ptr 无法编译