如何使用用户输入打开FILE并将其放入C语言的字符串中

时间:2018-11-29 22:33:55

标签: c arrays string

因此,我必须编写一个程序,使用指向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,但是我的老师向我发送了它,所以如果有人可以解释这一点,那就太好了。我真的不知道我在做什么错。我将不胜感激。

2 个答案:

答案 0 :(得分:1)

发布的代码存在许多问题。我已经修复了代码中的问题,并留下了一些注释来描述我的所作所为。我确实认为该代码可以通过一些重组和重命名而受益(例如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;
}

答案 1 :(得分:0)

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

  1. getFileName应该可以帮助您获取文件名(顾名思义),因此在该函数中您不应同时拥有array1和userIn(事实上,甚至在该函数中也没有使用array1,因此可以消除所有togheter)。参数和文件名应为“相同”。

  2. data是本地FILE指针,这意味着一旦退出函数,它就会丢失。我的建议是使其全局化,或将其作为主类的参数传递。也不要在打开后关闭它的第一行。

  3. 我猜想getLineCount很好,但是通常这样做是一种很好的做法,可以在返回的结果中使用printf。

传递给第二个函数的最大值可能会帮助您获得一行的最大大小?可能是这样。

总而言之,您的getFileName应该返回文件名,以便该参数应由userIn来指定。文件的打开应在“主要功能”中完成,并在您完成与文件相关的所有操作后将其关闭,因此请在最后。另外,打开文件,您将获得文件名。

希望它对您有所帮助!让我们随时了解您的进度。