Чтение и сохранение целых слов из файла в массив - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы проанализировать слова внутри текстового файла (длину каждого слова, начальный символ и т. Д.).Для этого первым шагом является чтение каждого слова из файла и его сохранение в массиве.

В следующем коде мне удалось сохранить все символы внутри массива, но я не разделил их наслова.

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


FILE *inp;
char arr[100];
int i = 0;
int word_count = 0;
char c;
int char_count = 0;

inp = fopen("string_in.txt", "r");

    while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");
        arr[char_count] = c;
        word_count++;
    }
    else {
        //printf("%c", c); //print to check if file is being read correctly
        arr[char_count] = c; 
        printf("%c",arr[char_count]);
    }   
    char_count++;
}
printf("\n");
printf("Chars: %d, Words: %d\n", char_count, word_count+1);

printf("From array: \n");
for(i = 0; i <= word_count; i++) {
    printf("%c",arr[word_count]);
}

printf("\n");
fclose(inp);

return (EXIT_SUCCESS);

Входной текст:

This is a test

Вывод:

This
is
a
test
Chars: 15, Words: 4
From array:
This is a test

Я хотел бы получить доступ к следующим элементам:

arr[0] = 'This'
arr[3] = 'Test'

но так как я строка за символом, а не словом:

arr[0] = 'T'
arr[3] = 's'

Любые предложения о том, как это можно расширить для хранения полных слов?


РЕДАКТИРОВАТЬ:

Согласно ответу ниже:

while ((c = fgetc(inp)) != EOF) {
if (c == ' ' || c == '\n') {
    printf("\n");

    arr[word_count][char_count] = '\0'; //Terminate the string
    char_count = 0; //Reset the counter.
    word_count++;
}
else {
     arr[word_count][char_count] = c; 
     printf("%c",arr[word_count][char_count]);
}   
(char_count < 99)? (char_count++):(char_count = 0);
}


printf("From array: \n");
for(i = 0; i < word_count; i++) {
    printf("%s",arr[word_count]);
}

Печатает без вывода из массива.

This
is
a
test
Chars: 5, Words: 4
From array:

 Press [Enter] to close the terminal ...

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вы можете использовать Char ** для полного хранения слов

array [100] [100]

Поскольку в массиве [100] вы храните одинпоэтому при доступе к массиву [0] вы получаете доступ только к первой букве этой строки.

Вам необходимо изменить код и реализовать двойной массив вместо одного

0 голосов
/ 03 декабря 2018

Как говорили другие пользователи, вы должны использовать 2D-массивы.Они объявляются и инициализируются следующим образом: arr[10][100] (10 будет количеством слов для хранения, измените его в соответствии с вашими потребностями).

while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");
        arr[word_count][char_count]='\0';
        char_count=0;
        word_count++;
    }
    else {
        arr[word_count][char_count] = c;
        printf("%c",arr[word_count][char_count]);
        char_count++;
    }
    if(char_count>=100) // security in case a word is too long
        char_count=0;
}
word_count++;

printf("\n");
printf("Chars: %d, Words: %d\n", char_count, word_count);

printf("From array: \n");
for(i = 0; i < word_count; i++) {
    printf("%s ",arr[i]);
}

Имейте в виду, что, поскольку я сбрасываю char_count каждыйКогда появляется новое слово, его значение после цикла не будет тем, что вы ожидаете (это будет только длина последнего слова), и значение, отображаемое в printf, будет неправильным.Если вы действительно заботитесь об этом, вам придется создать другую переменную.

0 голосов
/ 03 декабря 2018

В настоящее время у вас есть место для хранения одного string.

char arr[100]; -->char arr[100][100];

Тогда ваше чтение изменится, как показано ниже.

while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");

        arr[word_count][char_count] = '\0'; //Terminate the string
        char_count = 0; //Reset the counter.
        word_count++;
    }
    else {
         arr[word_count][char_count] = c; 
         printf("%c",arr[word_count][char_count]);

         if (char_count < 99)
              char_count++;
            else
              char_count = 0;
    }   
}

И ваша печать изменится, как показано ниже.

for(i = 0; i < word_count; i++) {
    printf("%s",arr[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...