2014-01-15 6 views
-1

Я хочу спросить о обработке файлов и структуре на языке C, я получаю задание из своей лекции и настолько запутался в строковых манипуляциях в программировании на языке C. Вот задача.Прочтите файл .txt и сохраните его в struct в c

  1. получить данные из mhs.txt
  2. магазин в структура
  3. сортировки по названию возрастанию

здесь является mhs.txt

1701289436#ANDI#1982 
1701317124#WILSON#1972 
1701331734#CHRISTOPHER STANLEY#1963 
1701331652#SHINVANNI THEODORE#1962 
1701331141#MUHAMMAD IMDAAD ZAKARIA#1953 
1701331564#MARCELLO GENESIS DRIET J.#1942 
1701322282#ANANDA AULIA#1972 
1701329175#LORIS TUJIBA SOEJONOPOETRO#1983 
1701301422#DEWI JULITA#1993 
1701332610#HARRY HUTALIANG#1982 

, прежде чем # это NIM, после первого # это имя и последний после #, это

год

и вот что я сделал

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct student{ 
    char nim[11]; 
    char name[50]; 
    int year; 
}s[10]; 
int main(){ 
    FILE *fp; 
    int c,i,n; 

    printf("Read mhs.txt..."); 
    getchar(); 

    fp = fopen("mhs.txt", "r"); 
    c = getc(fp); 
    i = 0; 
    while(c!=EOF){ 
     printf("%c", c); 
     c   = getc(fp); 
     i++; 
    } 
    fclose(fp); 
    getchar(); 
    return 0; 
} 

Первое, что я мог бы сохранить данные на структуры , но здесь я очень смутился, чтобы отделить строку.

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

Извините, если есть повторяющиеся вопросы, и извините, если мой английский слишком плохой.

+0

Подсказка: используйте strtok для разделения этих строк. и поместите в свою структуру s [i] .name и т. д., используя strcpy. –

+0

@Digital_Reality oke спасибо, я попробую – uccth

+0

Вы должны читать по строкам .. getline может быть ... прямо сейчас вы читаете только персонажа за раз. –

ответ

0

Это чистый код, вы должны три новые функции импорта C: strtok & qsort & fsan.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
struct student 
{ 
    char nim[11]; 
    char name[50]; 
    int year; 
}; 

#define BUFFER_SIZE 100 

struct student saveToStruct (char* str) 
{ 
    struct student res; 
    int flag = 0; 
    char *token = strtok(str, "#"); 

    while(token != NULL) 
    { 
     if (0 == flag) 
      strcpy(res.nim, token); 
     else if (1 == flag) 
      strcpy(res.name, token); 
     else 
      res.year = atoi(token); 

     flag++; 
     token = strtok(NULL, "#"); 
    } 
    return res; 
} 
void print(struct student* arr, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     printf("%s, %s, %d\n", arr[i].nim, arr[i].name, arr[i].year); 
    } 
} 
int cmp(const void* l, const void* r) 
{ 
    return strcmp(((const student*)l)->name, ((const student*)r)->name); 
} 
int main() 
{ 
    struct student arr[10]; 
    FILE* file = fopen("mhs.txt", "r"); 
    if (!file) 
     return -1; 

    char buffer[BUFFER_SIZE]; 
    int flag = 0; 
    while (fgets(buffer, BUFFER_SIZE, file)) 
    { 
     arr[flag] = saveToStruct(buffer); 
     flag++; 
    } 
    print(arr, 10); 

    qsort(arr, 10, sizeof(struct student), cmp); 
    printf("After sort by name!\n"); 
    print(arr, 10); 
    return 0; 
} 
+0

thankyou так много! ты сделал это! – uccth

1

Поскольку вы добавили это как C++, я хотел бы использовать C++:

#include <iostream> 
#include <string> 
#include <algorithm> 

struct student { 
    std::string nim; 
    std::string name; 
    int year; 

    bool operator<(student const &other) { 
     return name < other.name; 
    } 

    friend std::istream &operator>>(std::istream &is, student &s) { 
     std::getline(is, s.nim, '#'); 
     std::getline(is, s.name, '#'); 
     return is >> s.year; 
    }  
}; 

int main() { 
    std::ifstream in("mhs.txt"); 

    std::vector<student> students{ 
     std::istream_iterator<student>(in), 
     std::istream_iterator<student>() 
    }; 

    std::sort(students.begin(), students.end()); 
} 

Если вы хотите достичь примерно то же самое в C, это, вероятно, проще всего сделать чтение с fscanf используя набор сканируемых символов преобразования, как:

fscanf(infile, "%10[^#]#%49[^#]#%d", student.nim, student.name, &student.year); 

преобразование набор сканируемых символов дает вам что-то подобное подмножество регулярных выражений, поэтому %[^#] преобразует строку символов до (но не включая его) #. В этом случае я ограничил длину каждого на один меньше, чем длина, которую вы дали для массивов в определении структуры, чтобы предотвратить переполнение буфера.

Затем вы можете выполнить сортировку с помощью qsort. Вам нужно будет написать функцию сравнения, и делать это правильно не всегда очевидно:

int cmp(void const *aa, void const *bb) { 
    student const *a = aa; 
    student const *b = bb; 

    return strcmp(a->name, b->name); 
} 
+0

hahahha oke oke (y) Я ознакомлюсь с этим кодом: D – uccth

+0

Обычный, простой и, очевидно, лучший. – Abhineet

+0

Большое спасибо за помощь! Это очень полезно! : D – uccth

1

Вот несколько советов, а не полный ответ. Надеюсь, это может вам помочь.

Сначала вам нужно прочитать файл по строкам, вместо символа по символу. Вам нужна функция fgets(). вы можете найти ссылку с сайта www.cplusplus.com/reference/cstdio/fgets/

секунд вы можете использовать strtok() для разделения строк. вот пример.

char str[] = "now # is the time for all # good men to come to the # aid of their country"; 
char delims[] = "#"; 
char *result = NULL; 
result = strtok(str, delims); 
while(result != NULL) { 
    printf("result is \"%s\"\n", result); 
    result = strtok(NULL, delims); 
} 

и вы можете найти ссылку на strtok() от http://www.cplusplus.com/reference/cstring/strtok/

трети, используйте qsort() для сортировки массива структуры. вы можете найти ссылку на него от http://www.cplusplus.com/reference/cstdlib/qsort/. примеры также можно найти там.

+0

ОК! спасибо: D ... – uccth

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