Создать список, записать его в файл и вывести в правильной кодировке - C (СИ)
Формулировка задачи:
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct sp { char *info; struct sp *next; }sp; sp *sozdaniespiska(); void cleaning(); void vfail(); void izfaila(); int main(){ int k; char a[100]; sp *head; head=NULL; printf("Vvedite kolichestvo strok:\n"); scanf("%d",&k); cleaning(stdin); printf("Vvedite stroki:\n"); while(k--){ scanf("%s",a); head=sozdaniespiska(a,head); } printf("Otvet\n"); vfail(head); izfaila(); return 0; } sp *sozdaniespiska(char a[], sp *head) { sp *buf = (sp*)malloc(sizeof(sp)); buf->info = (char*) malloc(strlen(a) + 1); strcpy(buf->info, a); buf->next = NULL; if (head) { sp* cur = head; for (;cur->next; cur = cur->next){} cur->next = buf; } else { head = buf; } return head; } void cleaning(FILE* stream) { int ch = getc(stream); while(ch != EOF && ch != '\n') ch = getc(stream); } void vfail(sp *head){ FILE *fp; fp=fopen("test", "w+b"); while(head){ fwrite(&head->info, sizeof(sp), 1, fp); head=head->next; } fclose(fp); } void izfaila(){ char *s; FILE *fp; fp=fopen("test", "r"); while(fread(&s, sizeof(s), 1, fp)) printf("%s\n", s); fclose(fp); }
Решение задачи: «Создать список, записать его в файл и вывести в правильной кодировке»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> #include <string.h> #define STRLEN 100 typedef struct sp { char info[STRLEN]; struct sp* next; } sp; sp* sozdaniespiska(); void cleaning(); void vfail(); void izfaila(); int main() { int k; char a[STRLEN]; sp* head; head = NULL; printf("Vvedite kolichestvo strok: "); scanf("%d", &k); fflush(stdin); printf("Vvedite stroki: "); while (k--) { scanf("%s", a); head = sozdaniespiska(a, head); } printf("Otvet\n"); vfail(head); izfaila(); return 0; } sp* sozdaniespiska(char a[], sp* head) { sp* buf = (sp*)malloc(sizeof(sp)); strncpy(buf->info, a, STRLEN); buf->next = NULL; if (head) { sp* cur = head; for (; cur->next; cur = cur->next) {} cur->next = buf; } else { head = buf; } return head; } void vfail(sp* head) { FILE* fp = fopen("test", "wb"); while (head) { fwrite(head->info, STRLEN, 1, fp); head = head->next; } fclose(fp); } void izfaila() { char s[STRLEN]; FILE* fp = fopen("test", "rb"); while (fread(s, STRLEN, 1, fp)) { printf("%s\n", s); } fclose(fp); }
Объяснение кода листинга программы
- #include
- подключает файл стандартного ввода/вывода, необходимый для отправки сообщений в консоль - #include
- подключает файл malloc.h, который содержит функции для работы с динамической памятью - #include
- подключает файл string.h, который содержит функции для работы со строками - #define STRLEN 100 - определяет размер строки в 100 символов
- typedef struct sp - объявляет структуру данных
sp
с полямиinfo
типа char иnext
типа указатель наsp
- *sp sozdaniespiska()** - объявляет функцию sozdaniespiska, которая создает новый элемент списка и добавляет его в конец списка
- void cleaning() - объявляет функцию cleaning, которая освобождает память, выделенную под динамические элементы списка
- *void vfail(sp head)** - объявляет функцию vfail, которая записывает список в файл в двоичном формате
- void izfaila() - объявляет функцию izfaila, которая читает список из файла и выводит его на экран
- int main() - объявляет функцию main, которая является точкой входа в программу
- scanf(
%d
, &k); - считывает количество строк для ввода из консоли - fflush(stdin); - очищает буфер ввода, чтобы предотвратить утечку данных при считывании
- printf(
Vvedite stroki:
); - выводит приглашение для ввода строк - while (k--) - выполняет цикл, пока количество строк больше нуля
- scanf(
%s
, a); - считывает строку из консоли - head = sozdaniespiska(a, head); - добавляет новую строку в начало списка
- printf(
Otvet\n
); - выводит сообщениеOtvet
- vfail(head); - записывает список в файл
test
в двоичном формате - izfaila(); - читает список из файла
test
и выводит его на экран - return 0; - завершает программу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д