2015-01-02 2 views
0

Итак, у меня есть файл с целыми числами, например:C копирование файла в структуру

14 
22 
82 
53 
61 
74 
47 
95 

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

Мой вопрос: есть ли быстрая и простая функция, например qsort, которая автоматически скопирует мой файл?

#include <stdio.h>  /* printf */ 
#include <stdlib.h>  /* qsort */ 

struct Element 
{ 
int userId; 
int score; 
}; 

struct Element elements[] = { 
{1, 13}, 
{2, 9}, 
{3, 13}, 
{4, 19}, 
{5, 8}, 
{6, 11}, 
{7, 14}, 
{8, 17}, 
}; 

int ascendingSortCompareFunction (const void * a, const void * b) 
{ 
    return (((struct Element *)a)->score - ((struct Element *)b)->score); 
} 

int descendingSortCompareFunction (const void * a, const void * b) 
{ 
    return ((struct Element *)b)->score) - (((struct Element *)a)->score; 
} 

int main() 
{ 
int n; 
int count; 

count = sizeof(elements)/sizeof(elements[0]); 

qsort(elements, count, sizeof(elements[0]), ascendingSortCompareFunction); 
printf ("UserID\tScore (Ascending Sort)\n"); 
for (n = 0 ; n < count ; n++) 
    printf ("%d\t%d\n", elements[n].userId, elements[n].score); 

qsort(elements, count, sizeof(elements[0]), descendingSortCompareFunction); 
printf ("UserID\tScore (Descending Sort)\n"); 
for (n = 0 ; n < count ; n++) 
    printf ("%d\t%d\n", elements[n].userId, elements[n].score); 

getchar(); 

return 0; 
} 
+0

Извините, но то, что делает QSort должны делать с номерами для чтения из файл? Просьба уточнить. – OldProgrammer

+1

Я не уверен, правильно ли я понял. Вы пытаетесь загрузить значения, которые находятся в вашем файле, в поле 'userId' элемента' Элемент ', присутствующего в вашем массиве' elements'? – RichouHunter

+0

@OldProgrammer Ничего, я понятия не имею, как прочитать файл в структуре. qsort - следующий бит –

ответ

1

Не уверен, имеется ли функция, но для ее выполнения не требуется много кода.

Вы открываете файл:

FILE *fp; 
fp = fopen("myfile.txt", "r") 

Тогда цикл и читать этот файл по одной строке за раз, и вставьте каждый Int в массив структуры:

//looping through file and array with i as a counter 
fscanf(fp,"%d", &elements[i].score); 

Это предполагает, что вы читаете баллы из вашего файла. Надеюсь, этого достаточно, чтобы вы начали!

О, и закройте файл после:

fclose(fp); 
+0

Не говоря уже о элементах struct element [8] ' – Gopi

+0

Да, я читаю целые числа из файла. –

+3

это должно быть & elements [i] .score, а не элементы [i] .score –

0

Я почти уверен, что это то, что вы ищете

#include <stdio.h>  /* printf */ 
#include <stdlib.h>  /* qsort */ 

struct Element 
{ 
    int userId; 
    int score; 
}; 

int ascendingSortCompareFunction (const void * a, const void * b) 
{ 
    return (((struct Element *)a)->score - ((struct Element *)b)->score); 
} 

int descendingSortCompareFunction (const void * a, const void * b) 
{ 
    return -ascendingSortCompareFunction(a, b); 
} 

void readFromFile(const char *const filename, struct Element **elements, size_t *count) 
{ 
    FILE *file; 
    void *auxiliary; 
    int index; 
    int score; 
    char line[128]; 

    if ((elements == NULL) || (count == NULL)) 
     return; 
    *count = 0; 
    *elements = NULL; 
    file  = fopen(filename, "r"); 
    if (file == NULL) 
     return; 

    index = 0; 
    while (fgets(line, sizeof(line), file) != NULL) 
    { 
     if (sscanf(line, "%d", &score) == 1) 
     { 
      auxiliary = realloc(*elements, (1 + *count) * sizeof(struct Element)); 
      if (auxiliary == NULL) 
      { 
       free(*elements); 
       fclose(file); 

       *elements = NULL; 

       return; 
      } 
      *elements     = auxiliary; 
      (*elements)[*count].userId = 1 + index; 
      (*elements)[*count].score = score; 

      *count += 1; 
      index += 1; 
     } 
    } 
    fclose(file); 
} 

int main() 
{ 
    size_t   count; 
    size_t   n; 
    struct Element *elements; 
    size_t   size; 

    elements = NULL; 
    size  = sizeof(struct Element); 
    count = 0; 

    readFromFile("/home/iharob/file.txt", &elements, &count); 
    if ((elements != NULL) && (count > 0)) 
    { 
     qsort(elements, count, size, ascendingSortCompareFunction); 
     printf ("UserID\tScore (Ascending Sort)\n"); 

     for (n = 0 ; n < count ; n++) 
      printf ("%d\t%d\n", elements[n].userId, elements[n].score); 

     qsort(elements, count, size, descendingSortCompareFunction); 
     printf ("UserID\tScore (Descending Sort)\n"); 

     for (n = 0 ; n < count ; n++) 
      printf ("%d\t%d\n", elements[n].userId, elements[n].score); 

     free(elements); 
    } 
    getchar(); 

    return 0; 
} 
+1

после этой строки: '* elements = NULL;' должна быть строка: '* count = 0;' – user3629249

+0

@ user3629249 Вау, это была очень глупая ошибка. Хотя 'count' инициализируется в' main() 'и, следовательно, ошибки не было, но лучше инициализировать его в' readFromFile() '. –

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