Как открыть файл с пользовательским вводом и поместить его в строку в C - PullRequest
0 голосов
/ 30 ноября 2018

Итак, мне нужно написать программу, которая предлагает пользователю ввести имя файла, используя указатель на массив, созданный в 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 голосов
/ 30 ноября 2018

Было много проблем с размещенным кодом.Я исправил проблемы с кодом и оставил несколько комментариев, описывающих то, что я сделал.Я действительно думаю, что этот код может выиграть от некоторой реструктуризации и переименования (например, array1 не говорит вам, какова цель переменной).Функция getLineCount () не работает для строк, которые превышают MAX_WIDTH и должны быть переписаны для подсчета реальных строк, а не просто вызовов 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;
}
0 голосов
/ 30 ноября 2018

Есть несколько вещей, которые, я думаю, вам следует исправить на первый взгляд:

  1. getFileName должен помочь вам получить имя файла (как следует из названия), поэтому в этой функции вам не следуетиметь как array1, так и userIn (по сути, array1 даже не используется в функции, поэтому он может быть исключен всеми вместе).Параметр и имя файла должны быть «одинаковыми».

  2. data - это локальный указатель FILE, это означает, что после выхода из функции вы теряете его.Я рекомендую сделать его глобальным или передать его в качестве аргумента от основного класса.Также не закрывайте его на 1 строку после его открытия.

  3. Я полагаю, что getLineCount - это хорошо, но обычно это хорошая практика для возврата и printf в main, что возвращается.

Этот максимум, который передается второй функции, может помочь вам с максимальным размером строки?это может быть.

Подводя итог, ваш getFileName должен вернуть имя файла, так что userIn - это то, что должно быть задано этим параметром.Открытие файла должно быть сделано В ОСНОВНОЙ ФУНКЦИИ и должно быть закрыто после всего, что вы делаете, связанного с файлом, поэтому в концеКроме того, откройте файл после того, как вы получите имя файла.

Надеюсь, это поможет вам!Держите нас в курсе ваших успехов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...