2013-10-13 2 views
0

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

Пример файла данных (это называется TestData):

h e l l o a c d 
f g b w o r l d 
h a c c v b n a 
e q b x n t q q 
y e h n c a q r 
hello 
world 
hey 

Я хочу, чтобы хранить все буквы в 2-й массив. Кроме того, мне нужно сохранить все слова в 1-мерном массиве.

Максимальное количество строк столбцов или строк, которые могут быть указаны в файле данных AxA, равным 25. Таким образом, я считаю, что я должен объявить массив этого размера для буквы, а затем записать их в это массив.

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

+0

Используйте 'fopen',' fscanf' и т. Д. Это действительно новичок. – Barmar

+1

Что касается _всех букв в массиве 2x2, вы имеете в виду двумерный массив. Я вижу больше, чем массив 2x2. – ryyker

+0

@ryyker извините, мой плохой. да, я имел в виду 2-й массив. – user2441391

ответ

1

Учитывая ваш вопрос, и ваш вклад, есть несколько вопросов, но в интересах времени, на данный момент, я сделал некоторые предположения о размерах массива, т.е., что это не обязательно квадратное (как подразумевается колонками или строками, которые AxA square). Фактический образец данных не согласен, поэтому я написал процедуру, которая учитывает все по мере ее появления. Массив букв - это просто массив массивов, но поскольку он хранится в последовательной памяти, он просто выглядит как один длинный массив. Строки также находятся там, где есть место. В любом случае, этот код должен иллюстрировать достаточно, чтобы вы попали на правильный путь ...

#include <ansi_c.h> 
#include <stdio.h> 

void GetFileContents(char *file, int *nWords, int *lw, int *r, int *c); 
void allocMemoryStr(int numStrings, int max); 
void allocMemoryLtr(int numStrings, int max); 
void freeMemoryStr(int numStrings); 
void freeMemoryLtr(int numletters); 
#define FILENAME "c:\\dev\\play\\_puzzle.txt" 

char **letters; 
char **strings; 

int main() 
{ 
    int longest, cnt, wCount, rows, cols, i; 
    char line[260]; 
    FILE *fp; 
    char *buf=0; 

    GetFileContents(FILENAME, &wCount, &longest, &rows, &cols); 

    allocMemoryStr(wCount, longest); //for strings 
    allocMemoryLtr(rows*cols, 1); //for strings 

    //read file into string arrays 
    fp = fopen(FILENAME, "r"); 
    cnt=0; 
    for(i=0;i<rows;i++) 
    { 
     fgets(line, 260, fp); 
     buf = strtok(line, " \n"); 
     while(buf) 
     { 
      strcpy(letters[cnt], buf); 
      buf = strtok(NULL, " \n"); 
      cnt++;      //use as accurate count of words. 
     } 
    } 
    cnt=0; 
    while(fgets(line, 260, fp)) //get remainder of lines into strings 
    { 
     //[EDIT]removed fgets() 
     buf = strtok(line, " \n"); 
     while(buf) 
     { 
      strcpy(strings[cnt], buf); 
      buf = strtok(NULL, " \n"); 
      cnt++;      //use as accurate count of words. 
     } 
    } 
    fclose(fp); 
    freeMemoryStr(wCount); 
    freeMemoryLtr(rows*cols); 
    return 0; 
} 

void GetFileContents(char *file, int *nWords, int *lw, int *r, int *c) 
{ 
    char line[260]; 
    FILE *fp; 
    char *buf=0; 
    char temp[80]; 
    int wc=0, rc=0, cc=0, ck=0; 

    fp = fopen(FILENAME, "r"); 
    while(fgets(line, 260, fp)) 
    { 
     rc++; 
     buf = strtok(line, " \n"); 
     while(buf) 
     { 
      strcpy(temp, buf); // word handler 
      if(strlen(temp) > 1) 
      { 
       wc++; 
       rc--; // 
      } 
      else if(strlen(temp) == 1) //leter handler 
      { 
       cc++; 
       (cc>ck)?(ck=cc):(cc=cc); 
      } 
      buf = strtok(NULL, " \n"); 
     } 
     cc = 0; 
    } 
    fclose(fp); 
    *nWords = wc; 
    *r = rc; 
    *c = ck; 
} 

void allocMemoryStr(int numStrings, int max) 
{ 
    int i; 
    strings = calloc(sizeof(char*)*(numStrings+1), sizeof(char*)); 
    for(i=0;i<numStrings; i++) 
    { 
     strings[i] = calloc(sizeof(char)*max + 1, sizeof(char)); 
    } 
} 
void allocMemoryLtr(int numletters, int max) 
{ 
    int i; 
    letters = calloc(sizeof(char*)*(numletters+1), sizeof(char*)); 
    for(i=0;i<numletters; i++) 
    { 
     letters[i] = calloc(sizeof(char)*max + 1, sizeof(char)); 
    } 
} 

void freeMemoryStr(int numStrings) 
{ 
    int i; 
    for(i=0;i<numStrings; i++) 
     if(strings[i]) free(strings[i]); 
    free(strings); 
} 
void freeMemoryLtr(int numletters) 
{ 
    int i; 
    for(i=0;i<numletters; i++) 
     if(letters[i]) free(letters[i]); 
    free(letters); 
} 
+0

Спасибо, что нашли время ответить. Я посмотрел на ваш ответ, и я пытаюсь изучить концепции, которые вы использовали. Я закончил использование fgetc для создания массивов. – user2441391

1

Я бы проанализировал файл строки за строкой и char на char, который ищет то, что мне нужно. В примере (который непроверен) я держу три счетчика, чтобы правильно заполнить массивы.

char letters[25][25]; 
char words[10][25] 

int letters_x_pos = 0; // Row counter 
int letters_y_pos = 0; // Column counter 
int words_pos = 0; 

for (int i = 0; i < 25; i++) { 
    for (int j = 0; j < 25; j++) { 
     letters[i][j] = '\0'; 
    } 
} 

const char *line; 
while (line = some_read_function()) { 
    if (!(strlen(line) > 1)) { 
     continue; 
    } 

    if (line[1] == ' ') { 
     // Line contains letters 
     const char *letter = line; 
     while (*letter != '\0') { 
      if (*letter == ' ' || *letter == '\n' || *letter == '\r') { 
       continue; 
      } 
      else { 
       letters[letters_x_pos][letters_y_pos++] = *letter; 
      } 
      if (letters_y_pos == 25) { 
       // Maximum reached 
       break; 
      } 
      letter++; 
     } 
     // Increment row counter and reset column counter 
     letters_x_pos++; 
     letters_y_pos = 0; 
     if (letters_x_pos == 25) { 
      // Maximum reached 
      break; 
     } 
    } 
    else { 
     // Line contains word 
     strncpy(words[words_pos++], line, 25); 
     if (words_pos == 25) { 
      // Maximum reached 
      break; 
     } 
    } 
} 
Смежные вопросы