为什么错误struct FILE *但是参数是char *类型?

时间:2016-01-12 07:44:20

标签: c

我想知道为什么我收到错误“期望结构文件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;
   }

3 个答案:

答案 0 :(得分:1)

您的代码中存在许多问题,可能是

  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
    
  2. read_open_file()内部执行

    char *inputFileName = argv[1];
    

    错误,因为inputFileName是一个指针,而您正在尝试为其分配charargv[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_filemain打开 - 您将无法关闭在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");