我想知道为什么我收到错误“期望结构文件FILE *但参数是char *类型”?是因为我传入的是一个类型(字符串)而不是一个类型(FILE)?我计划将变量char * file_name更改为FILE * file_name,但是我将如何处理scanf中的%s?
FILE *read_open_file(char *argv)
{
FILE *ifp;
char *inputFileName = argv[1];
printf("File name %s",inputFileName);
ifp = fopen(inputFileName,"r");
if (ifp == NULL)
{
fprintf(stderr,"File %s does not exist",inputFileName);
exit(1);
}
return ifp;
}
int main()
{
char *file_name;
printf("Please enter file name: ");
scanf("%s", &file_name);
read_open_file(file_name);
read_command();
//printf("%c", read_command());
evaluate_command();
return 0;
}
答案 0 :(得分:1)
您的代码中存在许多问题,可能是
在您的代码中
char *file_name;
printf("Please enter file name: ");
scanf("%s", &file_name);
调用undefined behavior,因为您没有将内存分配给fine_name
并将指针的地址传递给scanf()
。我没有看到file_name
成为指针的原因。使用数组nad更改代码,如
char file_name[64] = {0};
printf("Please enter file name: ");
scanf("%63s", file_name); //save from buffer overflow
在read_open_file()
内部执行
char *inputFileName = argv[1];
错误,因为inputFileName
是一个指针,而您正在尝试为其分配char
(argv[1]
)。你不需要这一切。当您将包含文件名的字符串作为参数直接传递给函数时,在read_open_file()
内,您可以执行类似
FILE *ifp = NULL;
printf("File name %s\n",argv);
ifp = fopen(argv,"r");
完成你的工作。
答案 1 :(得分:1)
解决其他问题后,您会发现需要将read_open_file
的回复分配到FILE*
中的main()
指针,否则,您将无法参考该文件您在read_open_file
中main
打开 - 您将无法关闭在read_open_file
中打开的文件。
如果您有任何疑问,请查看以下内容并告知我们。
#include <stdio.h>
#define FNSZ 128
FILE *read_open_file (char *fn);
int main (void) {
char file_name[FNSZ] = {0};
FILE *fp = NULL;
printf ("Please enter file name: ");
if (scanf ("%127s%*c", file_name) != 1) {
fprintf (stderr, "error: file_name entry failed.\n");
return 1;
}
/* you must assign return to FILE* */
fp = read_open_file (file_name);
if (!fp) {
fprintf (stderr, "error: file open failed '%s'\n", file_name);
return 1;
}
/* read/evaluate from here */
// read_command (...);
// evaluate_command (...);
fclose (fp);
return 0;
}
FILE *read_open_file (char *fn)
{
FILE *ifp;
printf ("File name %s\n", fn);
ifp = fopen (fn, "r");
if (ifp == NULL)
fprintf(stderr,"File %s does not exist", fn);
return ifp;
}
答案 2 :(得分:0)
你犯了一些错误。代码中的argv
本身就是指向文件名的指针。所以你可以直接使用它
printf("File name %s",argv);
ifp = fopen(argv,"r");