#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.h
的 FILE
是所谓的“不透明类型”。基本上,您不知道,也不想知道 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/