Создать список, записать его в файл и вывести в правильной кодировке - 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; - завершает программу