2016-04-24 2 views
-3

Я могу успешно показать слова текста. Но я не могу сортировать по алфавиту.Прочитайте большой текстовый файл и быстро отсортируйте его по алфавиту в программе C

Как вставить слова слова в текст myArray = (char) malloc (size);

Это мой код:

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

static int compare (const void * a, const void * b); 

int main(int argc, char *argv[]) 
{ 
    FILE *fp; 
    char ch; 
    int size = 0; 

    fp = fopen("data.txt", "r"); 
    if (fp == NULL) 
     printf("\nFile unable to open "); 
    else 
     printf("\nFile opened "); 
    fseek(fp, 0, 2); /* file pointer at the end of file */ 
    size = ftell(fp); /* take a position of file pointer un size variable */ 
    //char *myArray = (char*)malloc(size * sizeof *myArray); 
    char *myArray = (char*)malloc(size); 


    static const char filename[] = "data.txt"; 
    FILE *file = fopen(filename, "r"); 
    if (file != NULL){ 
     int ch, word = 0, index= 0,index2 = 0; 
     while ((ch = fgetc(file)) != EOF){ 
      if (isspace(ch) || ispunct(ch)){ 
       if (word){ 
        word = 0; 
        myArray[index++] = '\n'; 
        //putchar('\n'); 
       } 
      }else{ 
       word = 1; 
       //putchar(ch); 
       myArray[index++] = ch; 
       index2++; 
      } 
     } 
     printf("%s", myArray); 
     fclose(file); 
     int i; 
     for(i = 0;i < sizeof(myArray);i++){ 
      putchar(myArray[i]); 
     } 

     //qsort (array, 2, sizeof (const char *), compare); 
     //for (int i = 0; i < 2; i++) { 
     // printf ("%d: %s.\n", i, array[i]); 
     //} 
    } 
} 

static int compare (const void * a, const void * b) 
{ 
    return strcmp (*(const char **) a, *(const char **) b); 
} 
+0

Вы не можете использовать оператор 'sizeof' для определения количества элементов в массиве, выделенных через' malloc() '. Кстати, почему второй аргумент 'qsort()' в комментарии 2? Потому что это 'sizeof (myArray)' в каком-то 16-битном enviromnent? – MikeCAT

+0

Потому что до того, как я положил два слова в массив символов, так что hardcode 2. На самом деле, я не знаю, как четко заполнить данные массиву char и как получить размер. – kennethk

+0

Что произойдет, если вы попытаетесь запустить код? Предоставляет ли она ошибку компиляции, ошибку времени выполнения или неправильные результаты? Если последний, пожалуйста, укажите ожидаемый результат и фактический результат. – anatolyg

ответ

0

Вызов QSort() хочет массив указателей на символьные строки. Поэтому вам нужно будет упорядочить свои слова таким образом. Например:

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

char myArray[] = "This\nis\na\nsample\ntext\nstring\nas\nthough\nfrom\nyour\nfile"; 
char **myWords; 

// 
// Compare two strings case insensitive 
// 
static int compare (const void * a, const void * b) 
{ 
    char *aStr, *bStr; 
    int i, retVal; 

    if (!(aStr = strdup(*(const char **) a))) 
     return 1; 

    if (!(bStr = strdup(*(const char **) b))) { 
     free(aStr); 
     return -1; 
    } 

    for (i=0; i<strlen(aStr); i++) 
     aStr[i] = (char)tolower((int)aStr[i]); 

    for (i=0; i<strlen(bStr); i++) 
     bStr[i] = (char)tolower((int)bStr[i]); 

    retVal = strcmp(aStr, bStr); 

    free(aStr); 
    free(bStr); 

    return retVal; 
} 

int main() 
{ 
    char *curWord, *nextWord; 
    long wordCount; 
    int i; 

    // 
    // myArray contains an array of newline delimited words as 
    // you have in your code after reading from the file 
    // 
    for (i=0; i<strlen(myArray); i++) 
     putchar(myArray[i]); 

    // 
    // If myArray is empty then no need to sort 
    // 
    if (strlen(myArray) == 0) { 
     printf("Nothing to sort\n"); 
     return 0; 
    } 

    // 
    // Count how many newlines are in myArray - assume at least one 
    // 
    for (wordCount=1, nextWord=myArray; 
      (nextWord = strchr(nextWord, (int)'\n')); 
      wordCount++, nextWord++); 

    // 
    // If only one word then no need to sort 
    // 
    if (wordCount == 1) { 
     printf ("\n0: %s.\n", myArray); 
     return 0; 
    } 

    // 
    // Allocate enough space to hold a new copy of each word 
    // 
    if (!(myWords = calloc(wordCount, sizeof(char *)))) 
     return 1; 

    // 
    // Load words from myArray into myWords 
    // 
    curWord = nextWord = myArray; 
    i = 0; 
    while ((nextWord = strchr(nextWord, (int)'\n'))) { 
     *nextWord++ = '\0'; 
     myWords[i] = strdup(curWord); 
     if (!myWords[i]) { 
      printf("\nFile too big for memory\n"); 
      return 1; 
     } 
     i++; 
     curWord = nextWord; 
    } 
    myWords[i] = curWord; 

    // 
    // Sort the array of words in myWords 
    // 
    qsort(myWords, wordCount, sizeof(char *), compare); 

    // 
    // Dump out sorted array 
    // 
    printf("\n"); 
    for(i = 0; i < wordCount; i++) 
     printf("%d: %s.\n", i, myWords[i]); 

    // 
    // Free your memory here - but since exiting main() and 
    // program is ending no need to worry about it. 
    // 

    return 0; 
} 
+0

@T Johnson Но я хочу получить слова из большого текстового файла в char myArray. – kennethk

+0

В своем вопросе вы заявляете, что можете успешно показывать слова, но не сортировать. Таким образом, у вас есть слова уже в массиве символов, поскольку новая строка ограничена. Поэтому мой ответ начинается с этого момента. –

+0

@T Johnson Спасибо – kennethk

Смежные вопросы