2015-12-02 3 views
1

Поэтому у меня есть текстовый файл, который идет как это:Запоминание слов из текстового файла в массив символов, используя feof

ноль три два один пять ноль ноль пять семь .. и т.д.

и есть много его , 9054 слов, чтобы быть точным

Моя идея состояла в том, чтобы создать массив символов из 9054 пространств и хранить его, это то, что я сделал до сих пор:

#include <stdio.h> 

int main(void) 
{ 
char tmp; 
int i = 0; 
int j = 0; 
char array[44000]; 

FILE *in_file; 

in_file = fopen("in.txt", "r"); 

// Read file in to array 
while (!feof(in_file)) 
{ 
     fscanf(in_file,"%c",&tmp); 
     array[i] = tmp; 
     i++; 
} 

// Display array 
while (j<i) 
{ 
     printf("%c",array[j]); 
     j++; 
} 


fclose(in_file); 

while(1); 
return 0; 
} 

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

Также я не имею представление о том, что feof функция делает, особенно линия

while (!feof(in_file)) 

что делает эта строка означает в точности? К сожалению я до сих пор в детских этапах обучения C, я попытался глядя, что feof делает, но там не так много, чтобы найти

+0

вы создаете массив символов, но должны создавать массив (или лучше: список) строк. И для начинающих взгляните на это, например: http://stackoverflow.com/questions/12337614/how-feof-works-in-c – Marged

+0

Для вашего кода вы говорите: * ...это то, что я сделал до сих пор *, а затем вы говорите: * Также я не знаю, что делает функция feof ... * и использует 'feof'. Если вы написали код, почему вы используете 'feof', если вы не знаете, что он делает? – lurker

ответ

0
  1. Вместо проверки feof(), который говорит вам, если конец файла-произошло в предыдущей операции ввода , проверьте результат fscanf()

  2. Rea ds "words" с "%s" и ограничить максимальные номера char для чтения.

    char buf[100]; 
    fscanf(in_file,"%99s",buf); 
    

Полагая, что вместе:

#define WORD_SIZE_MAX 20 
    #define WORD_COUNT_MAX 10000 

    char array[WORD_COUNT_MAX][WORD_SIZE_MAX]; 
    unsigned word_i = 0; 

    for (i=0; i<WORD_COUNT_MAX; i++) { 
     if (fscanf(in_file,"%19s", word_list[i]) != 1) { 
     break; 
     } 
    } 

Другой подход заключается в использовании кода OP почти как есть. Прочитайте весь файл в 1 массив. Затем при печати пропустите белое пространство.

+0

привет спасибо за ответ, что вы имеете в виду, читает слова с% s? – anony

+0

и почему я создаю массив со строками и столбцами (wordcountmax и wordsizemax)? пожалуйста помоги! – anony

+0

@anony Каждый 'word_list [i]' хранит 1 слово с символами 'WORD_SIZE_MAX-1'. Фиксированный размер 'array [] []' поддерживает слова 'WORD_COUNT_MAX'. Другие подходы существуют с использованием управления памятью ('malloc()/free()'. Я думал, что это будет проще всего для кодирования и использования. – chux

0

Обычно вы можете использовать следующие шаги:

  • дамп весь текстовый файл буфера символов.
  • Используйте strtok, чтобы разделить буфер символов на несколько токенов или слов.
  • Используйте массив указателей на символ для хранения отдельных слов.

Что-то вроде этой линии. Обратите внимание: я использую ваш вопрос в качестве текстового файла. Вам необходимо будет заменить 20 соответствующим образом.

int main() 
    { 
     FILE *in_file; 
     in_file = fopen("in.txt", "r"); 
     fseek(in_file, 0, SEEK_END); 
     long fsize = ftell(in_file); 
     fseek(in_file, 0, SEEK_SET); 

     char *buf = malloc(fsize + 1); 
     fread(buf, fsize, 1, in_file); // Dump the whole file to a char buffer. 
     fclose(in_file); 

     char *items[20] = { NULL }; 
     char *pch; 

     pch = strtok (buf," \t\n"); 
     int i = 0; 
     while (pch != NULL) 
     { 
      items[i++] = pch; 
      pch = strtok (NULL, " \t\n"); 
     } 

     for(i = 0; i < 20; i++) 
     { 
      if(items[i] != NULL) 
      { 
       printf("items[%d] = %s\n", i, items[i]); 
      } 
     } 
     return 0; 
    } 

Выход:

items[0] = Storing 
items[1] = words 
items[2] = from 
items[3] = textfile 
items[4] = into 
items[5] = char 
items[6] = array 
items[7] = using 
items[8] = feof? 
Смежные вопросы