0

我必须在我的一个程序中使用以下 C 函数(使用 Kiel 编译器):

Prototype: int fopen (FILE* f, char* filename, char* mode)
Parameters: 
1. f-Pointer to file structure
2. filename-Pointer to a memory location that contains the filename.
3. mode-Pointer to a memory location that contains the file open mode.
Return Value: 1, if file was opened successfully.
0, otherwise.

当我尝试这个时,我收到错误:

FILE * f;
char* filename;
char* mode;
int t;


filename[0]= 'g';

mode[0]='w';


t= fopen( f, filename[0],mode[0]);

错误:

COPYRIGHT Copyright (C) 2012 - 2013 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** ERROR C141 IN LINE 171 OF F34x_MSD_F931DC_main.c: syntax error near 'FILE'
*** ERROR C202 IN LINE 171 OF F34x_MSD_F931DC_main.c: 'f': undefined identifier
*** ERROR C141 IN LINE 172 OF F34x_MSD_F931DC_main.c: syntax error near 'char'
*** ERROR C202 IN LINE 172 OF F34x_MSD_F931DC_main.c: 'filename': undefined identifier
*** ERROR C141 IN LINE 173 OF F34x_MSD_F931DC_main.c: syntax error near 'char'
*** ERROR C202 IN LINE 173 OF F34x_MSD_F931DC_main.c: 'mode': undefined identifier
*** ERROR C141 IN LINE 174 OF F34x_MSD_F931DC_main.c: syntax error near 'int'
*** ERROR C202 IN LINE 174 OF F34x_MSD_F931DC_main.c: 't': undefined identifier
*** ERROR C202 IN LINE 177 OF F34x_MSD_F931DC_main.c: 'filename': undefined identifier
*** ERROR C202 IN LINE 179 OF F34x_MSD_F931DC_main.c: 'mode': undefined identifier
*** ERROR C202 IN LINE 182 OF F34x_MSD_F931DC_main.c: 't': undefined identifier

C51 COMPILATION COMPLETE.  0 WARNING(S),  11 ERROR(S)

有人可以帮助我正确使用吗?

更新:

当我将变量声明放在 main 的开头时,我设法消除了所有错误。但是现在出现了一个新错误:

COPYRIGHT Copyright (C) 2012 - 2013 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** ERROR C214 IN LINE 184 OF F34x_MSD_F931DC_main.c: illegal pointer conversion

我在这里得到了一些提示,但即使这样也无法理解如何解决这个问题

4

4 回答 4

2
int fopen (FILE* f, char* filename, char* mode)

这意味着您应该将指向char的指针传递给argument filename,但您传递filename[0]的是char。同样的情况也发生在 argumentmode上。

下面的代码将做:

FILE* f;
char* filename="file.txt";   //assuming the file you want to write in is called file.txt and in the same folder with the project
int t;

t= fopen(f, filename, "w");

但是,我认为您应该花一些时间来完全了解有关 C 的一些基础知识。您没有malloc为指针提供任何内存,这往往会导致一些运行时错误。而且您似乎对类型有点混乱。在处理文件之前最好有扎实的基础,否则会出现更多问题。

于 2013-07-11T11:43:40.523 回答
1

传递参数的正确方法是

            t= fopen(f, filename, mode);
于 2013-07-11T11:49:13.157 回答
0

有几个错误,让我想,你对 C 指针没有经验。因此,除了你的问题:

a) 所有指针都未初始化。这将导致未定义的行为。

b) 所有指针都指向未保留的内存。这将导致未定义的行为。

c)filename并且modechar *认为是字符串。它们必须是 0 终止的。

与您的问题主题有更高的关系:

d)您没有传递指针,而是数组的第一个元素,指针应该指向(并且不指向

可能你想做这样的事情:

t= fopen( f, "g", "w");

这是可行的,因为字符串文字char *在 C 中。

fopen()e) C中已经有一个。

f)如果你有自己的,它应该可以通过参数列表fopen()返回一个类型的实体。FILE *有两种方法可以做到这一点:

你有一个类型的实体FILE并传递一个指向它的指针:

 FILE file;
 t= fopen( &file, "g", "w");

fopen()创建该实体,因此您有一个类型的实体FILE *并将指针传递给它:

FILE *file;
t= fopen( &file, "g", "w");

我强烈建议花更多时间学习指针在 C 中的工作原理。这并不容易。

于 2013-07-11T12:23:49.537 回答
0

在这里,filenameandmode都是char*s(指向 char 的指针)。但是,您给出fopen filename[0]mode[0],两者都是chars。

char* filename;
char* mode;
t= fopen( f, filename[0],mode[0]);

正确的方法是传递char*s:

t= fopen(f, filename, mode);

这不会导致您的编译错误,但会导致运行时错误:在取消引用它们之前,您没有为指针分配内存。您可以通过以下几种方式解决此问题:

1:将它们声明为数组:

char filename[2] = "g";
char mode[2] = "w";
...

2:动态分配内存:

char * filename = calloc(2,1);
char * mode = calloc(2,1);
filename[0]= 'g';
mode[0]='w';
...
free(filename);
free(mode);
于 2013-07-11T11:43:47.430 回答