Не могу сканировать в .txt файл, используя fgets в гибкую структуру данных - PullRequest
0 голосов
/ 20 мая 2019

У меня есть домашнее задание, которое требует от меня обработки файлов .txt путем сканирования их в гибкую структуру данных и последующего поиска в файлах слов с заглавными буквами. У меня проблемы со сканированием в этой гибкой структуре данных, которую я использую. Причина, по которой структура данных должна быть гибкой, заключается в том, что она должна иметь возможность обрабатывать любые файлы .txt.

Структура данных, которую я хочу использовать, представляет собой массив, который указывает на массивы, содержащие содержимое строки. Я открыт для использования другой структуры, если это проще.

Я пытался сканировать его построчно, используя fgets и используя malloc для выделения, достаточного для хранения строки, но, похоже, это не сработало.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STEPSIZE 100

int main()
{
    FILE *inputFile;

    //Opens the file in read mode
    inputFile = fopen("testfile.txt", "r");

    //Error message if file cannot open
    if (inputFile == NULL)
    {
        printf("Unable to open file");
        return 1;
    }

    int arrayLen = STEPSIZE;

    // Allocate space for 100 lines. The **lines is the data structure used to store all the lines

    char **lines = (char **)malloc(STEPSIZE * sizeof(char*));

    char buffer[3000];

    int i = 0;

    while (fgets(buffer, 3000, inputFile))
    {

        //Checks if the array is full, and extends it
        if(i == arrayLen)
        {
            arrayLen += arrayLen;
            char ** newLines = realloc(lines, 200 * sizeof(char*));
            if(!newLines)
            {
                printf("cant realloc\n");
            }
            lines= newLines;
        }


        // Get length of buffer
        int lengthOfBuffer = strlen(buffer);

        //Allocate space for string. The +1 is for the terminating character
        char *string = (char *)malloc((lengthOfBuffer + 1) * sizeof(char));

        //copy string from buffer to string
        strcpy(string, buffer);

        //Attach string to data structure
        lines[i] = string;

        //Increment counter
        i++;
        printf("%s", lines[i]);
    }

    //Closes the file
    fclose(inputFile);


    for (int j = 0; j < 100; j++){
        printf("%s \n", lines[i]);
    }

    return 0;
}

Когда запускается последний цикл for, в идеале содержимое файла печатается, просто чтобы показать, что он был сохранен и может быть обработан, но в настоящее время я получаю код выхода 11.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 20 мая 2019

Здесь есть проблема:

//Increment counter
i++;
printf("%s", lines[i]);    // you're printing the next file that does not yet exist

Правильный код:

printf("%s", lines[i]);
//Increment counter
i++;

И еще один здесь:

for (int j = 0; j < 100; j++) {  // your loop variable is j
  printf("%s \n", lines[i]);     // but you use i here.
}

Правильный код:

for (int i = 0; i < 100; i++) {
  printf("%s \n", lines[i]);
}

И еще один здесь:

  arrayLen += arrayLen;
  char ** newLines = (char**)realloc(lines, 200 * sizeof(char*));
  // here the new length of your array is inconditionally 200
  // but actually the new array length is arrayLen 

Правильный код:

  arrayLen += arrayLen;
  char ** newLines = (char**)realloc(lines, arrayLen * sizeof(char*));

Могут быть и другие проблемы, я не все проверял.

Кстати: sizeof(char) равно 1 по определению, так что вы можете просто уронить его.

Кстати: arrayLen += arrayLen; Вы уверены, что это то, что вы хотите?Вы удваиваете размер своего массива каждый раз.Это не обязательно неправильно, но при использовании этого метода длина массива очень быстро увеличится до очень большого числа.Вы, вероятно, хотели это: arrayLen += STEPSIZE;

BTW3:

while (fgets(buffer, 3000, inputFile))

на самом деле это не так, но вам лучше написать это:

while (fgets(buffer, sizeof buffer, inputFile))

, что исключаетодна из двух жестко закодированных констант 3000.

BTW4: в конце вы печатаете только первые 100 строк, которые вы прочитали.Вы должны иметь возможность исправить это самостоятельно.

Кстати: вы также должны освободить всю выделенную память.Я оставляю это как упражнение для вас.Подсказка: это около трех строк кода, которые нужно добавить в конце main.

...