Чтение файла в массив и пропуск новых строк - PullRequest
0 голосов
/ 23 февраля 2019

Эй, ребята, я хочу прочитать файл с несколькими символами новой строки и перенести содержимое файла в массив.Например:

Файл:

I want to  
Make This  
File Into  
An Array  

и файл будет вставлен в массив как (псевдокод):

array [] = iwanttomakethisfileintoanarray

Я знаю, как пропустить пробелыи измените заглавные буквы, и я использую fscanf для сканирования файла и ввода символов в массив.

Моя проблема в том, что

while(fscanf(f, "%s",  array) != EOF) 

прерывается, когда он достигает символа новой строки.Я искал решение, но пока пусто.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 февраля 2019

НИКОГДА не используйте спецификатор преобразования "%s" без width, чтобы ограничить количество символов, записываемых в пункт назначения.например."%99s" для чтения 99 символов в массив из 100.

Чтение файла слово за словом, используя scanf(), только для того, чтобы избавиться от пробела, только комплиментарные вещи, так как вам нужно будет tolower() каждый символкаждое слово в любом случае.Лучше читать файл символ за символом в первую очередь:

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

enum { BUFFER_GROWTH = 4 };

int main(void)
{
    char const *filename = "test.txt";
    FILE *input = fopen(filename, "r");
    if (!input) {
        fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", filename);
        return EXIT_FAILURE;
    }

    size_t length  = 0;
    size_t size    = 1;
    char  *buffer  = malloc(size * sizeof *buffer);
    for (int ch; (ch = fgetc(input)) != EOF;) {
        if (!isprint((char unsigned) ch) || isspace((char unsigned) ch))
            continue;

        if (length + 1 >= size) {
            char *tmp = realloc(buffer, (size *= BUFFER_GROWTH) * sizeof *buffer);
            if (!tmp) {
                free(buffer);
                fclose(input);
                fputs("Not enough memory :(", stderr);
                return EXIT_FAILURE;
            }
            buffer = tmp;
        }

        buffer[length++] = tolower((char unsigned) ch);
    }
    buffer[length] = '\0';

    puts(buffer);

    free(buffer);
    fclose(input);
}
...