Запись числа в файл - C (СИ)
Формулировка задачи:
Не могу понять где ошибка. Есть структура "Государство", создаю файл, добавляю информацию - при выводе нормальным остаётся только название страны, в остальных колонках получаются непонятные цифры. Подскажите, что здесь не так. Желательно на Си
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <io.h> #include <string.h> #include <stdlib.h> #include <windows.h> int Total = 0; char FileName[100]; char *OpenFileMsg = "\n Для работы необходимо создать файл (пункт 1)\n"; struct GOROD { char Gor[20]; char Stol[20]; int pl; int adr; int Chisl; }; struct GOROD Mas[500]; int Save(); int menu() { int q; printf("================\n===== МЕНЮ =====\n================"); printf("\n1: Создать файл"); printf("\n2: Добавить информацию о стране"); printf("\n3: Удалить информацию о стране"); printf("\n4: Изменить"); printf("\n5: Список"); printf("\n6: Сортировка по стране\n"); scanf_s("%d", &q); return q; } void Edit(int Num) { printf("\nНазвание страны: \n"); scanf("%s", &Mas[Num].Gor[20]); printf("Столица: \n"); scanf("%s", &Mas[Num].Stol[20]); printf("Численность: \n"); scanf("%d", &Mas[Num].Chisl); printf("Площадь: \n"); scanf("%d", &Mas[Num].pl); printf("Адрес: \n"); scanf("%d", &Mas[Num].adr); } int Add() { Edit(Total); Total++; if (Save()) { return 1; } else { Total--; printf("\n\n"); return 0; } } int Save() { FILE *out; int i; if ((out = fopen(FileName, "w+t")) == NULL) { return 0; } fseek(out, 0, 0); for (i = 0; i<Total; i++) { fprintf(out, "\n%s;\n", &Mas[i].Gor[20]); fprintf(out, "%s;\n", &Mas[i].Stol[20]); fprintf(out, "%d;\n", &Mas[i].Chisl); fprintf(out, "%d;\n", &Mas[i].pl); fprintf(out, "%d;\n", &Mas[i].adr); if (i != Total - 1) { fprintf(out, "\n"); } } fclose(out); return 1; } void List() { int i; for (i = 0; i<Total; i++) { printf("%s\n", &Mas[i].Gor[20]); printf("%s\n", &Mas[i].Stol[20]); printf("%d\n", &Mas[i].Chisl); printf("%d\n", &Mas[i].pl); printf("%d\n", &Mas[i].adr); printf("\n"); } } void CreateNewFile() { FILE *NewFile; printf("Введите название файла\n"); char s[100]; scanf("%s", &s); if ((NewFile = fopen(s, "w+t")) == NULL) { printf("\n"); _getch(); } else { fclose(NewFile); Total = 0; strcpy(FileName, s); printf("Новый файл успешно создан.\n"); } } int main() { int c=0, n; SetConsoleCP(1251); SetConsoleOutputCP(1251); while (1) { switch (menu()) { case 2: { if (strcmp(FileName, "") == NULL) { printf(OpenFileMsg); } else { Add(); } } break; case 4: { if (strcmp(FileName, "") == NULL) { printf(OpenFileMsg); } else { printf("Укажите номер города: "); scanf("%d", &n); Edit(n); } } break; case 5: { if (strcmp(FileName, "") == NULL) { printf(OpenFileMsg); } else { List(); } } break; case 1: { CreateNewFile(); } break; } } }
Решение задачи: «Запись числа в файл»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdlib.h> int Total = 0; char FileName[100]; char* OpenFileMsg = "\n Для работы необходимо создать файл (пункт 1)\n"; struct GOROD { char Gor[20]; char Stol[20]; int pl; int adr; int Chisl; }; struct GOROD Mas[500]; int Save(); int menu() { int q; printf("================\n===== МЕНЮ =====\n================"); printf("\n1: Создать файл"); printf("\n2: Добавить информацию о стране"); printf("\n3: Удалить информацию о стране"); printf("\n4: Изменить"); printf("\n5: Список"); printf("\n6: Сортировка по стране\n"); scanf("%d", &q); return q; } void Edit(int Num) { printf("\nНазвание страны: \n"); scanf("%s", Mas[Num].Gor); printf("Столица: \n"); scanf("%s", Mas[Num].Stol); printf("Численность: \n"); scanf("%d", &Mas[Num].Chisl); printf("Площадь: \n"); scanf("%d", &Mas[Num].pl); printf("Адрес: \n"); scanf("%d", &Mas[Num].adr); } int Add() { Edit(Total); Total++; if (Save()) { return 1; } else { Total--; printf("\n\n"); return 0; } } int Save() { FILE* out; int i; if ((out = fopen(FileName, "w+t")) == NULL) { return 0; } fseek(out, 0, 0); for (i = 0; i < Total; i++) { fprintf(out, "\n%s;\n", Mas[i].Gor); fprintf(out, "%s;\n", Mas[i].Stol); fprintf(out, "%d;\n", Mas[i].Chisl); fprintf(out, "%d;\n", Mas[i].pl); fprintf(out, "%d;\n", Mas[i].adr); if (i != Total - 1) { fprintf(out, "\n"); } } fclose(out); return 1; } void List() { int i; for (i = 0; i < Total; i++) { printf("%s\n", Mas[i].Gor); printf("%s\n", Mas[i].Stol); printf("%d\n", Mas[i].Chisl); printf("%d\n", Mas[i].pl); printf("%d\n", Mas[i].adr); printf("\n"); } } void CreateNewFile() { FILE* NewFile; printf("Введите название файла\n"); char s[100]; scanf("%s", s); if ((NewFile = fopen(s, "w+t")) == NULL) { printf("\n"); getchar(); } else { fclose(NewFile); Total = 0; strcpy(FileName, s); printf("Новый файл успешно создан.\n"); } } int main() { int n; //SetConsoleCP(1251); //SetConsoleOutputCP(1251); while (1) { switch (menu()) { case 2: { if (strcmp(FileName, "") == 0) { puts(OpenFileMsg); } else { Add(); } } break; case 4: { if (strcmp(FileName, "") == 0) { puts(OpenFileMsg); } else { printf("Укажите номер города: "); scanf("%d", &n); Edit(n); } } break; case 5: { if (strcmp(FileName, "") == 0) { puts(OpenFileMsg); } else { List(); } } break; case 1: { CreateNewFile(); } break; } } }
Объяснение кода листинга программы
В данном коде происходит запись информации о странах в файл.
- Объявлены переменные:
- Total - счетчик количества добавленных стран;
- FileName - строка для хранения имени файла;
- OpenFileMsg - строка с сообщением о необходимости создания файла;
- GOROD - структура, содержащая информацию о стране (название, столица, численность населения, площадь и адрес);
- Mas - массив структур GOROD;
- menu() - функция, реализующая меню программы;
- Edit(int Num) - функция, позволяющая редактировать информацию о стране;
- Add() - функция, добавляющая информацию о стране в файл;
- Save() - функция, сохраняющая информацию о странах в файл;
- List() - функция, выводящая список стран из файла;
- CreateNewFile() - функция, создающая новый файл;
- main() - основная функция программы.
- В функции main() в цикле while(1) происходит выбор действия из меню с помощью функции menu().
- При выборе действия 2 происходит добавление информации о стране в файл. Если файл пуст, выводится сообщение об необходимости его создания.
- При выборе действия 4 происходит редактирование информации о стране. Если файл пуст, выводится сообщение об открытии файла.
- При выборе действия 5 происходит вывод списка стран из файла. Если файл пуст, выводится сообщение об открытии файла.
- При выборе действия 1 происходит создание нового файла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д