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

Creating dynamic file pointers in C++

#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]);
                                         ^

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

你的问题是这样的:

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

因为fp是指针类型,所以fp[0]的类型是FILE,不是FILE*

如果要声明两个文件指针的数组,直接这样做:

FILE *fp[2];

(这意味着 fp 将像一个 FILE**)

不要new FILE 对象。 fopen() 为您分配该内存。 <stdio.h> 包含 C 风格的声明,因此其中的东西没有构造函数,通常必须像 C 对象而不是 C++ 对象一样对其进行操作。

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

现在,你的代码...

FILE *fp;

声明 FILE* 类型的变量 fp

fp = new FILE [2];

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

FILE *fp[2];

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

希望这对您有所启发!