【问题标题】:How do you open a FILE with the user input and put it into a string in C如何使用用户输入打开文件并将其放入 C 中的字符串中
【发布时间】:2018-11-29 22:33:54
【问题描述】:

所以我必须编写一个程序,提示用户输入文件名,使用指向在 main 中创建的数组的指针,然后打开它。在一个单独的函数中,我必须将用户定义的字符串带到在 main 打开的文件中,并根据它在循环中读取的字符串数返回文件中的行数,并将该值返回给调用者。

所以对于我的第一个功能,这就是我所拥有的。

void getFileName(char* array1[MAX_WIDTH])
{
  FILE* data;
  char userIn[MAX_WIDTH];
  printf("Enter filename: ");
  fgets(userIn, MAX_WIDTH, stdin);
  userIn[strlen(userIn) - 1] = 0;
  data = fopen(userIn, "r");

  fclose(data);
  return;
}

对于我的第二个功能,我有这个。

int getLineCount(FILE* data, int max)
{
  int i = 0;
  char *array1[MAX_WIDTH];
  if(data != NULL)
  {
    while(fgets(*array1, MAX_WIDTH, data) != NULL)
    {
      i+=1;
    }
  }
  printf("%d", i);
  return i;
}

我主要有这个。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_WIDTH 144

void getFileName(char* array1[MAX_WIDTH]);
int getLineCount(FILE* data, int max);
int main(void) 
{
  char *array1[MAX_WIDTH];
  FILE* data = fopen(*array1, "r");
  int max;
  getFileName(array1);
  getLineCount(data, max);
  return 0;
}

我的文本文件是这个。

larry snedden 123 mocking bird lane
sponge bob 321 bikini bottom beach
mary fleece 978 pasture road
hairy whodunit 456 get out of here now lane

我的问题是,每次我运行这个程序时,我都会得到一个 0 作为回报,我认为这不是我应该得到的回报。另外,在我的第二个函数中,我不知道为什么我需要 int max 但我的老师发送我需要它,所以如果有人能解释一下,那就太好了。我真的不知道我做错了什么。我会很感激我能得到的任何帮助。

【问题讨论】:

  • char* array1[MAX_WIDTH] 开头——不是指向数组的指针;这是一个指针数组(长度未知;MAX_WIDTH 被忽略)。没关系;无论如何,该参数都未使用。如果该函数的目的是返回用户选择的文件名,那么参数应该是指向缓冲区的指针(char *)和缓冲区大小,both 由调用者提供。函数本身应返回指示成功或失败的状态,调用者应根据该状态采取相应的行动。
  • @WhozCraig MAX_WIDTH 不会被忽略。 char * array1[MAX_WIDTH] 创建一个 char 指针数组,该数组中的元素个数为 MAX_WIDTH
  • @WilliamPursell 这是一个函数参数。因此,阵列上级维度丢失。该声明相当于char **array1。还是您在谈论main。我指的是getFileName的论点。
  • 啊,不,我指的是main第一行的变量定义。在该行中,不会忽略 MAX_WIDTH。在函数声明中,它是。差别不大。
  • @WilliamPursell 啊...好的。是的,参数的命名没有帮助。我同意。在main 中,它是一个具体的数组。当然,我应该更清楚。

标签: c arrays string


【解决方案1】:

发布的代码存在许多问题。我已经解决了代码的问题,并留下了一些描述我所做的事情的 cmets。我确实认为这段代码可以通过一些重组和重命名受益(例如,array1 没有告诉你变量的目的是什么)。对于超过 MAX_WIDTH 的行,getLineCount() 函数被破坏,应该重写以计算实际行数,而不仅仅是对 fgets 的调用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_WIDTH 144

/** 
 * Gets a handle to the FILE to be processed.
 * - Renamed to indicate what the function does
 * - removed unnecessary parameter, and added return of FILE*
 * - removed the fclose() call
 * - added rudimentary error handling.
 **/
FILE *getFile() 
{
      char userIn[MAX_WIDTH+1];
      printf("Enter filename: ");
      fgets(userIn, MAX_WIDTH, stdin);
      userIn[strlen(userIn) - 1] = 0; // chop off newline.
      FILE *data = fopen(userIn, "r");
      if (data == NULL) {
          perror(userIn);
      }
      return data;
}

/**
 * - removed the unnecessary 'max' parameter
 * - removed null check of FILE *, since this is now checked elsewhere.
 * - adjusted size of array1 for safety.
 **/
int getLineCount(FILE* data)
{
    int i = 0;
    char array1[MAX_WIDTH+1];
    while(fgets(array1, MAX_WIDTH, data) != NULL)
    {
        i+=1;
    }
    return i;
}

/** 
 * - removed unnecessary array1 variable
 * - removed fopen of uninitialized char array.
 * - added some rudimentary error handling.
 */
int main(void)
{
    FILE *data = getFile();
    if (data != NULL) {
        int lc = getLineCount(data);
        fclose(data);
        printf("%d\n", lc);
        return 0;
    }
    return 1;
}

【讨论】:

  • 嗨,谢谢。这很好,但是,因为这是一个学校项目,我必须包含 char *array1,有没有我可以做到这一点?
  • 我假设你的意思是void getFileName(char* array1[MAX_WIDTH])。问题在于它定义了一个指向字符的指针数组,而不是一个字符数组。如果您希望此方法返回用户输入的文件的名称,那么您可以像这样定义它void getFile(char userIn[])。然后将您的文件名变量定义为 main 中的 char 数组,并将其传递给 getFile()。这样就可以了。在调用 getFile() 之后,您还必须在 main 中打开文件。
  • 好的,所以对于第一个函数,我必须提示用户输入文件名并使用指向 main 中创建的数组的指针。那是 void getFileName(char* array1[MAX_WIDTH]) 还是 void getFile(char userIn[])?抱歉问了这么多问题,我很困惑。
  • 您将使用第二个。调用 getFileName 后,传入 getFile 的 char 数组将保存用户输入的值。
【解决方案2】:

我认为你首先应该修复几件事:

    1234563它可以全部消除)。参数和文件名应该“相同”。
  1. data 是一个本地 FILE 指针,这意味着一旦退出函数,它就会丢失。我的建议是将其设为全局,或将其作为主类的参数传递。也不要在打开后关闭它1行。

  2. 我猜 getLineCount 没问题,但通常是在 main 返回的内容中返回和 printf 的好习惯。

传递给第二个函数的最大值可能会帮助您确定线条的最大尺寸?可能是。

总而言之,您的 getFileName 应该返回文件名,因此 userIn 应该由该参数给出。文件打开应该在主要功能中完成,并在您完成与文件相关的所有操作后关闭,所以最后。此外,在获得文件名之后打开文件。

希望对您有所帮助!让我们随时关注您的进展。

【讨论】:

  • 所以因为这是一个学校项目,我必须使用 char* array1,我该怎么做才能包含它?
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多