在 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.h
的 FILE
就是所谓的 "opaque type"。基本上,您不知道,也不想知道 FILE
是什么、包含什么或解决什么。这样做是为了便携性。相反,您通过键入 FILE*
,通过指向 FILE
的指针来表示文件,无论 FILE
是什么。如果您查看 stdio
库,您会看到 所有 处理文件的函数都将 FILE*
作为参数,而不是 FILE
.毕竟,你应该永远不要自己创建一个FILE
对象!
现在,你的代码...
FILE *fp;
声明 FILE*
类型的变量 fp
。
fp = new FILE [2];
将一个新的2FILE
数组的地址分配给fp
。 不好! 你永远不应该自己操纵 FILE
s,而是 FILE*
s。所以,试试这个。
FILE *fp[2];
这将声明一个包含两个 FILE
指针的数组,称为 fp
。您的其余代码应该可以正常使用。碰巧你在这里不需要 new
(那是用来在堆上分配的),而且很浪费。你甚至 delete
都没有!如果您来自 Java 背景,请阅读构造函数和 operator new
之间的区别,以便让您自己更清楚一些。
希望这对您有所启发!
#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.h
的 FILE
就是所谓的 "opaque type"。基本上,您不知道,也不想知道 FILE
是什么、包含什么或解决什么。这样做是为了便携性。相反,您通过键入 FILE*
,通过指向 FILE
的指针来表示文件,无论 FILE
是什么。如果您查看 stdio
库,您会看到 所有 处理文件的函数都将 FILE*
作为参数,而不是 FILE
.毕竟,你应该永远不要自己创建一个FILE
对象!
现在,你的代码...
FILE *fp;
声明 FILE*
类型的变量 fp
。
fp = new FILE [2];
将一个新的2FILE
数组的地址分配给fp
。 不好! 你永远不应该自己操纵 FILE
s,而是 FILE*
s。所以,试试这个。
FILE *fp[2];
这将声明一个包含两个 FILE
指针的数组,称为 fp
。您的其余代码应该可以正常使用。碰巧你在这里不需要 new
(那是用来在堆上分配的),而且很浪费。你甚至 delete
都没有!如果您来自 Java 背景,请阅读构造函数和 operator new
之间的区别,以便让您自己更清楚一些。
希望这对您有所启发!