我必须在我的一个程序中使用以下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
我得到了一些提示here,但即便如此也无法理解如何解决此问题
答案 0 :(得分:2)
int fopen (FILE* f, char* filename, char* mode)
这意味着您应该将指针传递给参数filename
,但是您传递的是filename[0]
,这是一个字符。参数mode
也是如此。
以下代码将执行:
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
指针的任何内存,这往往会导致一些运行时错误。你似乎对类型有些混乱。在处理文件之前,最好有一个坚实的基础,否则会有更多的问题。
答案 1 :(得分:1)
传递参数的正确方法是
t= fopen(f, filename, mode);
答案 2 :(得分:0)
此处,filename
和mode
都是char*
s(指向char的指针)。但是,您提供fopen
filename[0]
和mode[0]
,这两者都是char
。
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);
答案 3 :(得分:0)
有几个错误让我觉得你没有C指针的经验。因此,除了你的问题:
a)所有指针都未初始化。这将导致未定义的行为。
b)所有指针都指向无保留的内存。这将导致未定义的行为。
c)filename
和mode
为char *
,并被视为字符串。它们必须以0结尾。
与您的问题主题有更高的关系:
d)你没有传递指针,但是数组的第一个元素,指针应指向(并且不)。
可能你想做这样的事情:
t= fopen( f, "g", "w");
这是有效的,因为字符串文字在C中是char *
。
e)C中已有fopen()
。
f)如果你有自己的fopen()
,它应该可以通过参数列表返回类型为FILE *
的实体。有两种方法可以做到这一点:
你有一个FILE
类型的实体,并传递一个指向这个的实体:
FILE file;
t= fopen( &file, "g", "w");
fopen()
创建该实体,因此您拥有类型为FILE *
的实体并传递指向此实体的指针:
FILE *file;
t= fopen( &file, "g", "w");
我强烈建议花更多时间学习,指针如何在C中工作。这并不容易。